From 0eb872360f2305f66554cdfe896bfb95e3e07bbb Mon Sep 17 00:00:00 2001 From: nyb_wsl <1034482587@qq.com> Date: Sat, 29 Aug 2026 21:59:37 +0800 Subject: [PATCH 1/3] feat(han-huan-shou-dao): land Phase A.1 showcase polish Add the Han huan-shou dao exhibit with oval ring, primary/companion hamon, closer hero framing, captureMargin 1.04, and brighter look-dev. Idle rock stays showcase-only via options.animate. Co-Authored-By: Claude --- public/references/han-huan-shou-dao.png | Bin 0 -> 159480 bytes .../createHanHuanShouDaoModel.ts | 2901 +++++++++++++++++ src/demos/registry.ts | 57 + 3 files changed, 2958 insertions(+) create mode 100644 public/references/han-huan-shou-dao.png create mode 100644 src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts diff --git a/public/references/han-huan-shou-dao.png b/public/references/han-huan-shou-dao.png new file mode 100644 index 0000000000000000000000000000000000000000..472d72f6d99fc760003190108ca5ed8aa401834c GIT binary patch literal 159480 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

y-|7GgO>qIAxX+a)rO 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%0AKels*yP6?wy2_{)_ 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

fK57+sNfiWoj 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 + meshes: Record; + sockets: Record; + colliders: Record; + destructionGroups: Record; +}; + +type SculptMaterialSpec = Record; + +// bevelEnabled defaults to true on THREE.ExtrudeGeometry and rounds every +// corner — sharp/pointed profiles (blades, fork tines, spikes) need +// bevelEnabled: false plus lineTo()-only path segments near the tip, since a +// curve command cannot produce a true converging point. +function buildExtrudeShape(points: [number, number][], holes?: [number, number][][]): THREE.Shape { + const shape = new THREE.Shape(); + if (points.length > 0) { + shape.moveTo(points[0][0], points[0][1]); + for (let i = 1; i < points.length; i += 1) { + shape.lineTo(points[i][0], points[i][1]); + } + } + // Cutouts (e.g. an oval wire-cutter hole) as THREE.Path added to shape.holes — + // dep-free boolean subtraction via the tessellator, no CSG library needed. + for (const loop of holes ?? []) { + if (loop.length < 3) continue; + const path = new THREE.Path(); + path.moveTo(loop[0][0], loop[0][1]); + for (let i = 1; i < loop.length; i += 1) path.lineTo(loop[i][0], loop[i][1]); + path.closePath(); + shape.holes.push(path); + } + return shape; +} + +// Build an N-gon oval loop (for hole authoring from a compact {cx,cy,rx,ry} descriptor). +function ovalLoop(cx: number, cy: number, rx: number, ry: number, seg = 24): [number, number][] { + const loop: [number, number][] = []; + for (let i = 0; i < seg; i += 1) { + const a = (i / seg) * Math.PI * 2; + loop.push([cx + Math.cos(a) * rx, cy + Math.sin(a) * ry]); + } + return loop; +} + +function buildExtrudeGeometry(profile: { points: [number, number][]; depth: number; holes?: [number, number][][]; ovalHoles?: { cx: number; cy: number; rx: number; ry: number }[] }): THREE.ExtrudeGeometry { + const holes = [...(profile.holes ?? []), ...((profile.ovalHoles ?? []).map((o) => ovalLoop(o.cx, o.cy, o.rx, o.ry)))]; + const shape = buildExtrudeShape(profile.points, holes); + return new THREE.ExtrudeGeometry(shape, { + depth: profile.depth, + bevelEnabled: false, + steps: 1, + }); +} + +// Ground blade: lofts a beveled cross-section along [x, spineY, edgeY] stations. +// Per station the section is: sharp cutting EDGE (z=0) → PRIMARY BEVEL up to the +// grind line (±T) → flat/saber body → SWEDGE near the tip (spine grinds to a false +// edge, z=0) or a squared spine elsewhere. Each cross-section face keeps a hard +// edge while indexed vertices smooth that face along the blade length. UVs map +// the doppler gradient along length (u) and height (v). +function buildGroundBladeGeometry(spec: { stations: [number, number, number][]; thickness?: number; thicknesses?: number[]; grindFrac?: number; swedgeFromTipFrac?: number; edgeTone?: number }): THREE.BufferGeometry { + const st = spec.stations; + if (st.length < 2) throw new Error('ground-blade requires at least two stations'); + if (spec.thicknesses && spec.thicknesses.length !== st.length) throw new Error('ground-blade thicknesses must match stations'); + const baseThickness = spec.thickness ?? 0.05; + const grindFrac = spec.grindFrac ?? 0.55; + const swedgeFrac = spec.swedgeFromTipFrac ?? 0.34; + const xG = st[0][0]; + const xT = st[st.length - 1][0]; + const len = (xT - xG) || 1; + // Actual blade Y bounds (stations are [x, topY, botY]) — v must span THESE, not a + // hardcoded ±0.12: a blade positioned off-origin would otherwise clamp v→1 and make + // every face sample the bright spine-rim row (the white-tip/washed-facet bug). + let yMin = Infinity, yMax = -Infinity; + for (const s of st) { yMin = Math.min(yMin, s[2]); yMax = Math.max(yMax, s[1]); } + const yH = (yMax - yMin) || 1; + const ring = (s: [number, number, number], stationIndex: number): [number, number, number][] => { + const [x, topY, botY] = s; + const rawHeight = topY - botY; + if (rawHeight <= 1e-6) return Array.from({ length: 7 }, () => [x, (topY + botY) * 0.5, 0] as [number, number, number]); + const h = rawHeight; + const T = (spec.thicknesses?.[stationIndex] ?? baseThickness) / 2; + const grindY = botY + grindFrac * h; + const swedgeY = topY - 0.42 * h; + const sz = ((xT - x) / len < swedgeFrac) ? 0 : T; // swedge → sharp false edge near tip + return [ + [x, botY, 0], [x, grindY, T], [x, swedgeY, T], [x, topY, sz], + [x, topY, -sz], [x, swedgeY, -T], [x, grindY, -T], + ]; + }; + const rings = st.map(ring); + const pos: number[] = []; + const uv: number[] = []; + const color: number[] = []; + const idx: number[] = []; + const edgeTone = THREE.MathUtils.clamp(spec.edgeTone ?? 0.55, 0.1, 1); + const sectionTones = [edgeTone, edgeTone, edgeTone, 1, 1, edgeTone, edgeTone]; + const vertex = (p: number[], tone = 1) => { + const n = pos.length / 3; + const v = (p[1] - yMin) / yH; + pos.push(p[0], p[1], p[2]); + uv.push((p[0] - xG) / len, v); + color.push(tone, tone, tone); + return n; + }; + // Duplicate the seven longitudinal strips at their boundaries. This preserves + // the cutting edge / grind / spine creases while smoothing within each strip. + for (let k = 0; k < 7; k++) { + const k2 = (k + 1) % 7; + const strip: [number, number][] = rings.map((r) => [vertex(r[k], sectionTones[k]), vertex(r[k2], sectionTones[k2])]); + for (let i = 0; i < strip.length - 1; i++) { + const [a, b] = strip[i]; + const [d, c] = strip[i + 1]; + idx.push(a, c, b, a, d, c); + } + } + const cap = (r: [number, number, number][], reverse: boolean) => { + const c = vertex([r.reduce((sum, p) => sum + p[0], 0) / 7, r.reduce((sum, p) => sum + p[1], 0) / 7, r.reduce((sum, p) => sum + p[2], 0) / 7]); + for (let k = 0; k < 7; k++) { + const a = vertex(r[k], sectionTones[k]); + const b = vertex(r[(k + 1) % 7], sectionTones[(k + 1) % 7]); + if (reverse) idx.push(c, a, b); else idx.push(c, b, a); + } + }; + cap(rings[0], true); + cap(rings[rings.length - 1], false); + const g = new THREE.BufferGeometry(); + g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3)); + g.setIndex(idx); + g.computeVertexNormals(); + g.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2)); + g.setAttribute('color', new THREE.Float32BufferAttribute(color, 3)); + g.userData.solidVolume = { kind: 'closed-surface-volume', watertightIntent: true, cappedEnds: true }; + return g; +} + +function buildTubeGeometry( + path: { points: [number, number, number][]; radius?: number; radialSegments?: number; closed?: boolean }, +): THREE.TubeGeometry { + const vectors = path.points.map(([x, y, z]) => new THREE.Vector3(x, y, z)); + const curve = new THREE.CatmullRomCurve3(vectors, path.closed ?? false); + const tubularSegments = Math.max(8, path.points.length * 6); + return new THREE.TubeGeometry(curve, tubularSegments, path.radius ?? 0.05, path.radialSegments ?? 8, path.closed ?? false); +} + +function hashString(value: string): number { + let hash = 2166136261; + for (let index = 0; index < value.length; index += 1) { + hash ^= value.charCodeAt(index); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} + +function readLayerNumber(value: unknown, keys: string[], fallback: number): number { + if (typeof value === 'number') return value; + if (value && typeof value === 'object') { + const record = value as Record; + for (const key of keys) { + if (typeof record[key] === 'number') return record[key] as number; + } + } + return fallback; +} + +function hexToRgb(hex: string): [number, number, number] { + const normalized = /^#[0-9a-f]{3}$/i.test(hex) + ? '#' + hex.slice(1).split('').map((part) => part + part).join('') + : hex; + const value = /^#[0-9a-f]{6}$/i.test(normalized) ? Number.parseInt(normalized.slice(1), 16) : 0x8a7a5f; + return [clampAlbedoChannel((value >> 16) & 255), clampAlbedoChannel((value >> 8) & 255), clampAlbedoChannel(value & 255)]; +} + +function materialPalette(spec: SculptMaterialSpec): string[] { + const palette = spec.colorVariation?.palette; + if (Array.isArray(palette) && palette.length > 0) return palette.filter((value) => typeof value === 'string'); + const secondary = spec.albedo?.secondary; + const colors = [spec.baseColor ?? spec.color ?? spec.albedo?.dominant, ...(Array.isArray(secondary) ? secondary : [])]; + return colors.filter((value): value is string => typeof value === 'string' && value.startsWith('#')); +} + +function clamp01(value: number): number { + return Math.max(0, Math.min(1, value)); +} + +function clampAlbedoChannel(value: number): number { + return Math.max(30, Math.min(240, Math.round(value))); +} + +function clampPbrF0(value: number): number { + return Math.max(0.02, Math.min(1, value)); +} + +function clampPbrIor(value: number): number { + return Math.max(1, Math.min(2.5, value)); +} + +function clampPbrMetalness(value: number): number { + return value >= 0.5 ? 1 : 0; +} + +function clampedAlbedoColor(spec: SculptMaterialSpec): THREE.Color { + const source = typeof spec.baseColor === 'string' ? spec.baseColor : '#8A7A5F'; + // setStyle with an explicit SRGBColorSpace, NOT the numeric constructor. + // + // `new THREE.Color(r, g, b)` treats its arguments as LINEAR working-space components, + // while an authored `baseColor` hex is sRGB. Feeding one to the other skipped the + // transfer function and lifted every dark albedo: #2e2a28, authored as a near-black + // vinyl, rendered at roughly sRGB 0.46 — a mid grey. The error is largest exactly where + // it matters most, because the transfer curve is steepest near black. + return new THREE.Color().setStyle(source, THREE.SRGBColorSpace); +} + +function smoothCurve(value: number): number { + return value * value * (3 - 2 * value); +} + +function periodicHash(x: number, y: number, seed: number, periodX: number, periodY: number): number { + const wrappedX = ((x % periodX) + periodX) % periodX; + const wrappedY = ((y % periodY) + periodY) % periodY; + let value = Math.imul(wrappedX + seed * 17, 374761393) ^ Math.imul(wrappedY + seed * 31, 668265263); + value = Math.imul(value ^ (value >>> 13), 1274126177); + return ((value ^ (value >>> 16)) >>> 0) / 4294967295; +} + +function periodicValueNoise(u: number, v: number, seed: number, periodX: number, periodY: number): number { + const x = u * periodX; + const y = v * periodY; + const x0 = Math.floor(x); + const y0 = Math.floor(y); + const tx = smoothCurve(x - x0); + const ty = smoothCurve(y - y0); + const a = periodicHash(x0, y0, seed, periodX, periodY); + const b = periodicHash(x0 + 1, y0, seed, periodX, periodY); + const c = periodicHash(x0, y0 + 1, seed, periodX, periodY); + const d = periodicHash(x0 + 1, y0 + 1, seed, periodX, periodY); + return THREE.MathUtils.lerp(THREE.MathUtils.lerp(a, b, tx), THREE.MathUtils.lerp(c, d, tx), ty); +} + +type SurfaceBand = { + frequency: number; + amplitude: number; + stretchX: number; + stretchY: number; + ridge: boolean; +}; + +function surfaceBands(spec: SculptMaterialSpec): SurfaceBand[] { + const source = Array.isArray(spec.surfaceFrequencyBands) ? spec.surfaceFrequencyBands : []; + const parsed = source.flatMap((item: unknown) => { + if (!item || typeof item !== 'object') return []; + const band = item as Record; + const frequency = typeof band.frequency === 'number' ? band.frequency : 0; + const amplitude = typeof band.amplitude === 'number' ? band.amplitude : 0; + if (frequency <= 0 || amplitude <= 0) return []; + const stretch = Array.isArray(band.stretch) ? band.stretch : [1, 1]; + const description = `${String(band.pattern ?? '')} ${String(band.role ?? '')}`.toLowerCase(); + return [{ + frequency, + amplitude, + stretchX: typeof stretch[0] === 'number' ? Math.max(0.1, stretch[0]) : 1, + stretchY: typeof stretch[1] === 'number' ? Math.max(0.1, stretch[1]) : 1, + ridge: /(ridge|groove|grain|fiber|striated|crack)/.test(description), + }]; + }); + return parsed.length > 0 ? parsed : [ + { frequency: 2, amplitude: 0.42, stretchX: 1, stretchY: 1, ridge: false }, + { frequency: 12, amplitude: 0.22, stretchX: 1, stretchY: 1, ridge: false }, + { frequency: 56, amplitude: 0.08, stretchX: 1, stretchY: 1, ridge: false }, + ]; +} + +function sampleSurface(u: number, v: number, bands: SurfaceBand[], seed: number): number { + let value = 0; + let weight = 0; + for (let index = 0; index < bands.length; index += 1) { + const band = bands[index]; + const periodX = Math.max(1, Math.round(band.frequency * band.stretchX)); + const periodY = Math.max(1, Math.round(band.frequency * band.stretchY)); + let sample = periodicValueNoise(u, v, seed + index * 1013, periodX, periodY); + if (band.ridge) sample = 1 - Math.abs(sample * 2 - 1); + value += sample * band.amplitude; + weight += band.amplitude; + } + return weight > 0 ? clamp01(value / weight) : 0.5; +} + +function mixPalette(colors: [number, number, number][], value: number): [number, number, number] { + if (colors.length === 1) return colors[0]; + const scaled = clamp01(value) * (colors.length - 1); + const index = Math.min(colors.length - 2, Math.floor(scaled)); + const mix = scaled - index; + const a = colors[index]; + const b = colors[index + 1]; + return [ + Math.round(THREE.MathUtils.lerp(a[0], b[0], mix)), + Math.round(THREE.MathUtils.lerp(a[1], b[1], mix)), + Math.round(THREE.MathUtils.lerp(a[2], b[2], mix)), + ]; +} + +type ColorGradientStop = { offset: number; color: string }; +type ColorGradientSpec = { + type: 'linear' | 'radial'; + axis: [number, number]; + stops: ColorGradientStop[]; +}; + +function parseRgba(value: string): [number, number, number] { + const match = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(value); + if (!match) return [138, 122, 95]; + return [clampAlbedoChannel(Number(match[1])), clampAlbedoChannel(Number(match[2])), clampAlbedoChannel(Number(match[3]))]; +} + +// Analytical per-pixel gradient sample. The extraction schema's colorGradient carries +// exact rgba(...) stop colors (see extract_part_color_recipe.py), so this samples the +// same trend directly in JS math rather than round-tripping through a Canvas 2D +// createLinearGradient/createRadialGradient object — same visual result, and it composes +// directly with the existing noise/height-correlated colorVariation blend below. +function sampleColorGradient(gradient: ColorGradientSpec, u: number, v: number): [number, number, number] { + const stops = gradient.stops.length >= 2 ? gradient.stops : [{ offset: 0, color: 'rgba(138,122,95,1)' }, { offset: 1, color: 'rgba(138,122,95,1)' }]; + let t: number; + if (gradient.type === 'radial') { + const [cx, cy] = gradient.axis; + const dx = u - cx; + const dy = v - cy; + const maxRadius = Math.max(0.001, Math.hypot(Math.max(cx, 1 - cx), Math.max(cy, 1 - cy))); + t = clamp01(Math.hypot(dx, dy) / maxRadius); + } else { + const [ax, ay] = gradient.axis; + const projection = (u - 0.5) * ax + (v - 0.5) * ay; + const maxProjection = 0.5 * (Math.abs(ax) + Math.abs(ay)) || 0.5; + t = clamp01(projection / maxProjection + 0.5); + } + const scaled = t * (stops.length - 1); + const index = Math.min(stops.length - 2, Math.max(0, Math.floor(scaled))); + const mix = scaled - index; + const a = parseRgba(stops[index].color); + const b = parseRgba(stops[index + 1].color); + return [ + THREE.MathUtils.lerp(a[0], b[0], mix), + THREE.MathUtils.lerp(a[1], b[1], mix), + THREE.MathUtils.lerp(a[2], b[2], mix), + ]; +} + +function writePixel(data: Uint8ClampedArray, offset: number, red: number, green: number, blue: number): void { + data[offset] = Math.max(0, Math.min(255, Math.round(red))); + data[offset + 1] = Math.max(0, Math.min(255, Math.round(green))); + data[offset + 2] = Math.max(0, Math.min(255, Math.round(blue))); + data[offset + 3] = 255; +} + +function makeCanvas(size: number): HTMLCanvasElement { + const canvas = document.createElement('canvas'); + canvas.width = size; + canvas.height = size; + return canvas; +} + +function createMapTexture( + canvas: HTMLCanvasElement, + colorSpace: THREE.ColorSpace, + spec: SculptMaterialSpec, + options: ProceduralModelOptions, +): THREE.CanvasTexture { + const texture = new THREE.CanvasTexture(canvas); + const projection = spec.textureProjection && typeof spec.textureProjection === 'object' ? spec.textureProjection : {}; + const repeat = Array.isArray(projection.repeat) ? projection.repeat : [2, 2]; + texture.colorSpace = colorSpace; + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set( + typeof repeat[0] === 'number' ? repeat[0] : 2, + typeof repeat[1] === 'number' ? repeat[1] : 2, + ); + texture.anisotropy = Math.max(1, Math.round(options.textureAnisotropy ?? projection.anisotropy ?? 8)); + texture.needsUpdate = true; + return texture; +} + +type ProceduralTextureSet = { + albedo: THREE.Texture; + roughness: THREE.Texture; + height: THREE.Texture; + normal: THREE.Texture; + ao: THREE.Texture; + source: 'reference-pixel-extraction' | 'procedural'; +}; + +function referenceMapUrl(spec: SculptMaterialSpec, channel: string): string | null { + const reference = spec.referencePbr; + if (!reference || typeof reference !== 'object') return null; + if (reference.usable === false) return null; + const confidence = typeof reference.confidence === 'number' + ? reference.confidence + : (typeof reference.estimatedFidelity === 'number' ? reference.estimatedFidelity : 0); + const threshold = typeof reference.targetThreshold === 'number' ? reference.targetThreshold : 0.7; + if (confidence < threshold) return null; + const maps = reference.maps; + if (!maps || typeof maps !== 'object') return null; + const map = (maps as Record)[channel]; + if (!map || typeof map !== 'object') return null; + const record = map as Record; + const url = typeof record.url === 'string' && record.url.trim() ? record.url : record.path; + return typeof url === 'string' && url.trim() ? url : null; +} + +function createLoadedMapTexture( + url: string, + colorSpace: THREE.ColorSpace, + spec: SculptMaterialSpec, + options: ProceduralModelOptions, +): THREE.Texture { + const texture = new THREE.TextureLoader().load(url); + const projection = spec.textureProjection && typeof spec.textureProjection === 'object' ? spec.textureProjection : {}; + const repeat = Array.isArray(projection.repeat) ? projection.repeat : [1, 1]; + texture.colorSpace = colorSpace; + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set( + typeof repeat[0] === 'number' ? repeat[0] : 1, + typeof repeat[1] === 'number' ? repeat[1] : 1, + ); + texture.anisotropy = Math.max(1, Math.round(options.textureAnisotropy ?? projection.anisotropy ?? 8)); + texture.needsUpdate = true; + return texture; +} + +function makeReferenceTextureSet(spec: SculptMaterialSpec, options: ProceduralModelOptions): ProceduralTextureSet | null { + const albedo = referenceMapUrl(spec, 'albedo'); + const roughness = referenceMapUrl(spec, 'roughness'); + const height = referenceMapUrl(spec, 'height'); + const normal = referenceMapUrl(spec, 'normal'); + const ao = referenceMapUrl(spec, 'ao'); + if (!albedo || !roughness || !height || !normal || !ao) return null; + return { + albedo: createLoadedMapTexture(albedo, THREE.SRGBColorSpace, spec, options), + roughness: createLoadedMapTexture(roughness, THREE.NoColorSpace, spec, options), + height: createLoadedMapTexture(height, THREE.NoColorSpace, spec, options), + normal: createLoadedMapTexture(normal, THREE.NoColorSpace, spec, options), + ao: createLoadedMapTexture(ao, THREE.NoColorSpace, spec, options), + source: 'reference-pixel-extraction', + }; +} + +function makeProceduralTextureSet( + id: string, + spec: SculptMaterialSpec, + options: ProceduralModelOptions, +): ProceduralTextureSet | null { + if (typeof document === 'undefined') return null; + const qualityFirst = (options.qualityPriority ?? 'reference-fidelity') === 'reference-fidelity'; + const requested = options.textureSize ?? spec.textureResolution; + const requestedSize = typeof requested === 'number' && Number.isFinite(requested) + ? requested + : (qualityFirst ? 1024 : 512); + const size = Math.max(256, Math.min(2048, 2 ** Math.round(Math.log2(requestedSize)))); + const canvases = { + albedo: makeCanvas(size), + roughness: makeCanvas(size), + height: makeCanvas(size), + normal: makeCanvas(size), + ao: makeCanvas(size), + }; + const contexts = { + albedo: canvases.albedo.getContext('2d'), + roughness: canvases.roughness.getContext('2d'), + height: canvases.height.getContext('2d'), + normal: canvases.normal.getContext('2d'), + ao: canvases.ao.getContext('2d'), + }; + if (!contexts.albedo || !contexts.roughness || !contexts.height || !contexts.normal || !contexts.ao) return null; + const images = { + albedo: contexts.albedo.createImageData(size, size), + roughness: contexts.roughness.createImageData(size, size), + height: contexts.height.createImageData(size, size), + normal: contexts.normal.createImageData(size, size), + ao: contexts.ao.createImageData(size, size), + }; + const seed = hashString(id); + const bands = surfaceBands(spec); + const heightField = new Float32Array(size * size); + const roughnessField = new Float32Array(size * size); + const palette = materialPalette(spec); + const fallback = typeof spec.baseColor === 'string' ? spec.baseColor : '#8A7A5F'; + const colors = (palette.length >= 2 ? palette : [fallback, '#6E614B', '#A08F70']).map(hexToRgb); + const baseRoughness = clamp01(readLayerNumber(spec.roughness, ['base'], 0.76)); + const roughnessVariation = clamp01(readLayerNumber(spec.roughness, ['variation'], 0.18)); + const colorAmplitude = clamp01(readLayerNumber(spec.colorVariation, ['amplitude', 'variation'], 0.18)); + const heightCorrelation = clamp01(readLayerNumber(spec.colorVariation, ['heightCorrelation'], 0.3)); + const colorGradient: ColorGradientSpec | undefined = spec.colorGradient; + for (let y = 0; y < size; y += 1) { + const v = y / size; + for (let x = 0; x < size; x += 1) { + const u = x / size; + const index = y * size + x; + const height = sampleSurface(u, v, bands, seed + 101); + const roughNoise = sampleSurface(u, v, bands, seed + 7001); + const colorNoise = sampleSurface(u, v, bands, seed + 15013); + heightField[index] = height; + roughnessField[index] = clamp01(baseRoughness + (roughNoise - 0.5) * roughnessVariation * 2); + let color: [number, number, number]; + if (colorGradient) { + // Evidence-derived spatial gradient (Plan 1.3 Workstream C) takes priority + // over the noise-based palette blend below — it is a measured trend, not a guess. + color = sampleColorGradient(colorGradient, u, v); + } else { + const paletteValue = clamp01( + 0.5 + (colorNoise - 0.5) * colorAmplitude * 2 + (height - 0.5) * heightCorrelation + ); + color = mixPalette(colors, paletteValue); + } + writePixel(images.albedo.data, index * 4, color[0], color[1], color[2]); + } + } + const normalStrength = Math.max(0.05, readLayerNumber(spec.normal, ['strength', 'amplitude'], 0.35)); + const aoStrength = clamp01(readLayerNumber(spec.ambientOcclusion, ['cavityStrength', 'strength'], 0.35)); + const dirtAmount = clamp01(readLayerNumber(spec.dirt, ['amount'], 0)); + const dirtCavityBias = clamp01(readLayerNumber(spec.dirt, ['cavityBias'], 0)); + const dirtColor = hexToRgb(typeof spec.dirt?.color === 'string' ? spec.dirt.color : '#3A3028'); + const edgeWear = clamp01(readLayerNumber(spec.wear, ['edgeWear', 'amount'], 0)); + for (let y = 0; y < size; y += 1) { + const up = ((y - 1 + size) % size) * size; + const down = ((y + 1) % size) * size; + for (let x = 0; x < size; x += 1) { + const left = (x - 1 + size) % size; + const right = (x + 1) % size; + const index = y * size + x; + const center = heightField[index]; + const dx = (heightField[y * size + right] - heightField[y * size + left]) * normalStrength * 6; + const dy = (heightField[down + x] - heightField[up + x]) * normalStrength * 6; + const inverseLength = 1 / Math.sqrt(dx * dx + dy * dy + 1); + const normalX = -dx * inverseLength; + const normalY = -dy * inverseLength; + const normalZ = inverseLength; + const neighborAverage = ( + heightField[y * size + left] + heightField[y * size + right] + + heightField[up + x] + heightField[down + x] + ) * 0.25; + const cavity = Math.max(0, neighborAverage - center); + const ao = clamp01(1 - aoStrength * (cavity * 12 + (1 - center) * 0.16)); + const offset = index * 4; + const cavityMask = clamp01(cavity * 12 + (1 - center) * 0.35); + const dirtMix = dirtAmount * THREE.MathUtils.lerp(0.2, 1, cavityMask * dirtCavityBias); + const wearMix = edgeWear * clamp01((center - 0.58) * 2.4); + for (let channel = 0; channel < 3; channel += 1) { + const base = images.albedo.data[offset + channel]; + const dirtied = THREE.MathUtils.lerp(base, dirtColor[channel], dirtMix); + images.albedo.data[offset + channel] = THREE.MathUtils.lerp(dirtied, Math.min(240, dirtied + 18), wearMix); + } + const heightByte = center * 255; + const roughnessByte = clamp01(roughnessField[index] + dirtMix * 0.12 - wearMix * 0.18) * 255; + writePixel(images.height.data, offset, heightByte, heightByte, heightByte); + writePixel(images.roughness.data, offset, roughnessByte, roughnessByte, roughnessByte); + writePixel( + images.normal.data, offset, + (normalX * 0.5 + 0.5) * 255, + (normalY * 0.5 + 0.5) * 255, + (normalZ * 0.5 + 0.5) * 255, + ); + writePixel(images.ao.data, offset, ao * 255, ao * 255, ao * 255); + } + } + contexts.albedo.putImageData(images.albedo, 0, 0); + contexts.roughness.putImageData(images.roughness, 0, 0); + contexts.height.putImageData(images.height, 0, 0); + contexts.normal.putImageData(images.normal, 0, 0); + contexts.ao.putImageData(images.ao, 0, 0); + return { + albedo: createMapTexture(canvases.albedo, THREE.SRGBColorSpace, spec, options), + roughness: createMapTexture(canvases.roughness, THREE.NoColorSpace, spec, options), + height: createMapTexture(canvases.height, THREE.NoColorSpace, spec, options), + normal: createMapTexture(canvases.normal, THREE.NoColorSpace, spec, options), + ao: createMapTexture(canvases.ao, THREE.NoColorSpace, spec, options), + source: 'procedural', + }; +} + +function createSculptMaterial(id: string, spec: SculptMaterialSpec, options: ProceduralModelOptions, denseComponent = false): THREE.MeshPhysicalMaterial { + // A material that declares -- with evidence -- that its subject carries no texture + // detail gets NO texture set. Synthesising one anyway is not a harmless default: the + // branch below then forces color to white and roughness to 1 and reads both from the + // generated maps, so the authored albedo and the reference-derived roughness are both + // discarded, and the model gains mottling the reference does not have. Measured on the + // tuxedo cat, whose black fur rendered as speckled grey-and-white from a palette that + // only ever described two flat regions. + const textureless = (spec.textureless as { declared?: boolean } | undefined)?.declared === true; + const textures = textureless + ? null + : makeReferenceTextureSet(spec, options) ?? makeProceduralTextureSet(id, spec, options); + const material = new THREE.MeshPhysicalMaterial({ + color: textures ? 0xffffff : clampedAlbedoColor(spec), + roughness: textures ? 1 : clamp01(readLayerNumber(spec.roughness, ['base'], 0.76)), + metalness: clampPbrMetalness(readLayerNumber(spec.metalness, ['base'], 0.0)), + clearcoat: clamp01(readLayerNumber(spec.clearcoat, ['base', 'amount'], 0)), + clearcoatRoughness: clamp01(readLayerNumber(spec.clearcoatRoughness, ['base'], 0.25)), + transmission: clamp01(readLayerNumber(spec.transmission, ['base', 'amount'], 0)), + ior: clampPbrIor(readLayerNumber(spec.ior, ['base', 'value'], 1.5)), + thickness: Math.max(0, readLayerNumber(spec.thickness, ['base', 'amount'], 0)), + attenuationDistance: Math.max(0.001, readLayerNumber(spec.attenuationDistance, ['base', 'value'], Infinity)), + attenuationColor: new THREE.Color(typeof spec.attenuationColor === 'string' ? spec.attenuationColor : '#ffffff'), + sheen: clamp01(readLayerNumber(spec.sheen, ['base', 'amount'], 0)), + sheenColor: new THREE.Color(typeof spec.sheenColor === 'string' ? spec.sheenColor : '#ffffff'), + sheenRoughness: clamp01(readLayerNumber(spec.sheenRoughness, ['base'], 1.0)), + iridescence: clamp01(readLayerNumber(spec.iridescence, ['base', 'amount'], 0)), + iridescenceIOR: clampPbrIor(readLayerNumber(spec.iridescenceIOR, ['base', 'value'], 1.3)), + anisotropy: clamp01(readLayerNumber(spec.anisotropy, ['base', 'amount'], 0)), + anisotropyRotation: readLayerNumber(spec.anisotropy, ['rotation'], 0), + specularIntensity: clampPbrF0(readLayerNumber(spec.specularF0 ?? spec.f0 ?? spec.specularIntensity, ['base', 'value'], 1.0)), + specularColor: new THREE.Color(typeof spec.specularColor === 'string' ? spec.specularColor : '#ffffff'), + emissive: new THREE.Color(typeof spec.emissive === 'string' ? spec.emissive : '#000000'), + emissiveIntensity: Math.max(0, readLayerNumber(spec.emissiveIntensity, ['base'], 1.0)), + opacity: clamp01(readLayerNumber(spec.opacity, ['base'], 1)), + transparent: readLayerNumber(spec.transmission, ['base', 'amount'], 0) > 0 || readLayerNumber(spec.opacity, ['base'], 1) < 1, + alphaTest: Math.max(0, readLayerNumber(spec.alpha, ['cutoff', 'alphaTest'], 0)), + wireframe: options.wireframe ?? false, + vertexColors: spec.vertexColors === true, + side: spec.doubleSided === true ? THREE.DoubleSide : THREE.FrontSide, + flatShading: spec.flatShading === true, + }); + if (textures) { + material.map = textures.albedo; + material.roughnessMap = textures.roughness; + material.normalMap = textures.normal; + material.normalScale.setScalar(Math.max(0.05, readLayerNumber(spec.normal, ['strength', 'amplitude'], 0.35))); + material.aoMap = textures.ao; + material.aoMap.channel = 0; + material.aoMapIntensity = readLayerNumber(spec.ambientOcclusion, ['cavityStrength', 'strength'], 0.35); + const denseMesh = denseComponent || spec.denseMesh === true || spec.geometryDensity === 'dense' || spec.topologyClass === 'dense'; + const bumpScale = Math.max(0, readLayerNumber(spec.bump, ['amplitude', 'strength'], 0)); + const effectiveBumpScale = denseMesh ? Math.max(0.05, bumpScale) : bumpScale; + if (effectiveBumpScale > 0) { + material.bumpMap = textures.height; + material.bumpScale = effectiveBumpScale; + } + const displacementScale = Math.max(0, readLayerNumber(spec.displacement, ['amplitude', 'strength'], 0)); + const effectiveDisplacementScale = denseMesh ? Math.max(0.005, displacementScale) : displacementScale; + if (effectiveDisplacementScale > 0) { + material.displacementMap = textures.height; + material.displacementScale = effectiveDisplacementScale; + material.displacementBias = -effectiveDisplacementScale * 0.5; + } + } + if (spec.vertexToneFinal === true) { + material.onBeforeCompile = (shader) => { + shader.fragmentShader = shader.fragmentShader.replace( + '#include ', + '#ifdef USE_COLOR\n gl_FragColor.rgb *= vColor;\n#endif\n#include ', + ); + }; + material.customProgramCacheKey = () => `${id}:vertex-tone-final`; + } + material.envMapIntensity = readLayerNumber(spec, ['envMapIntensity'], 0.8); + material.userData.sculptMaterial = spec; + material.userData.proceduralMapsIndependent = true; + material.userData.pbrConstraints = { albedoRange: [30, 240], binaryMetalness: true, f0Range: [0.02, 1], iorRange: [1, 2.5] }; + material.userData.pbrTextureSource = textures?.source ?? 'flat-fallback'; + material.userData.referencePbr = spec.referencePbr ?? null; + material.userData.referenceMaterialId = spec.referenceMaterialId ?? spec.materialReference?.profileId ?? null; + material.userData.materialEvidence = spec.materialEvidence ?? null; + material.userData.validationViews = spec.materialReference?.validationViews ?? []; + material.needsUpdate = true; + return material; +} + +type AttachmentEndpoint = { + start: THREE.Vector3; + midpoint: THREE.Vector3; + quaternion: THREE.Quaternion; + length: number; + baseRadius: number; + endRadius: number; +}; + +function readVector3(value: unknown, fallback: [number, number, number]): THREE.Vector3 { + if (Array.isArray(value) && value.length === 3 && value.every((item) => typeof item === 'number')) { + return new THREE.Vector3(value[0], value[1], value[2]); + } + return new THREE.Vector3(fallback[0], fallback[1], fallback[2]); +} + +function readNumber(value: unknown, fallback: number): number { + return typeof value === 'number' && Number.isFinite(value) ? value : fallback; +} + +function makeAttachmentEndpoint(attachment: unknown): AttachmentEndpoint | null { + if (!attachment || typeof attachment !== 'object') return null; + const record = attachment as Record; + const start = readVector3(record.localStart, [0, 0, 0]); + const end = readVector3(record.localEnd, [0, 1, 0]); + const delta = end.clone().sub(start); + const length = delta.length(); + if (length <= 0.0001) return null; + const direction = delta.clone().normalize(); + const quaternion = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), direction); + const baseRadius = Math.max(0.005, readNumber(record.baseRadius, 0.06)); + const endRadius = Math.max(0.003, readNumber(record.endRadius, baseRadius * 0.55)); + return { + start, + midpoint: delta.multiplyScalar(0.5), + quaternion, + length, + baseRadius, + endRadius, + }; +} + +// Generated from ObjectSculptSpec target: Han Huan-Shou Dao +// Sculpt build pass: optimization-pass +// This factory is intentionally pass-gated. Finish browser screenshot review before unlocking deeper passes. +export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): THREE.Group { + const root = new THREE.Group(); + root.name = "Han Huan-Shou Dao"; + root.userData.reconstructionEvidence = {"itemFamily": null, "subtype": null, "componentAdapter": null, "route": null, "exactnessTier": null, "referenceCamera": {"solved": false, "fovDegrees": 40.0, "aspect": 1.0, "orientation": {"yaw": 0.0, "pitch": 0.0, "roll": 0.0}, "positionHint": [0.0, 0.0, 3.0], "note": "For likeness work, solve the reference camera (forge/stage1_intake/solve_camera_pose.py) so the review render aligns with the photo and the reference can be projected. Confirm by overlay review."}, "approximationNotes": []}; + root.userData.materialPipeline = {}; + root.userData.materialReferenceRegistry = null; + + const materialMap: Record = {}; + materialMap["polished-steel"] = createSculptMaterial( + "polished-steel", + {"id": "polished-steel", "name": "Polished blade steel", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#AEB4BA", "color": "#AEB4BA", "albedo": {"dominant": "#AEB4BA", "secondary": ["#747B82", "#C8CDD1"], "samplingNotes": "Cool grey steel from the three-view plate, not the rusted photo."}, "colorVariation": {"palette": ["#747B82", "#AEB4BA", "#C8CDD1"], "pattern": "longitudinal-grind", "amplitude": 0.12, "heightCorrelation": 0.15}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [4.0, 1.0], "anisotropy": 8, "texelDensityIntent": "Keep grind lines running heel-to-tip."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 1.2, "amplitude": 0.12, "role": "broad value along the hamon zone"}, {"id": "meso", "frequency": 8.0, "amplitude": 0.08, "role": "longitudinal grind"}, {"id": "micro", "frequency": 36.0, "amplitude": 0.04, "role": "fine polish grit"}], "roughness": {"base": 0.44, "variation": 0.08, "map": "independent-procedural-field", "localResponse": "slightly higher below the hamon, lower on the polished shinogi"}, "metalness": {"base": 0.84, "variation": 0.05}, "envMapIntensity": 0.68, "vertexColors": true, "vertexToneFinal": true, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.14, "scale": 22.0, "space": "tangent"}, "bump": {"pattern": "longitudinal-grind", "amplitude": 0.002, "scale": 20.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.18, "contactShadowBias": 0.2, "notes": "Keep the blade bright; only darken the guard and wrap contacts."}, "wear": {"edgeWear": 0.16, "scratches": ["faint heel-to-tip grind"], "chips": []}, "dirt": {"amount": 0.04, "cavityBias": 0.2, "color": "#6A6864"}, "patina": {"amount": 0.0, "color": "#AEB4BA", "notes": "Illustrated as clean steel."}, "localOverrides": [{"id": "hamon-band", "region": "wavy band along the edge, distal two-thirds", "albedo": "#D8DCE0", "roughness": 0.34, "notes": "Hamon is drawn, not a geometry bevel. Blockout keeps it as a value/roughness stain.", "evidenceRefs": ["blade-face"]}, {"id": "edge-brightening", "region": "cutting edge", "albedo": "#E8EBEE", "roughness": 0.2, "evidenceRefs": ["blade-face"]}], "shaderNotes": ["Polished steel: high metalness, mid-low roughness. Not rust, not chrome mirror.", "Do not reuse albedo as roughness."], "notes": "Reconstruct the three-view illustration, not the excavated relic photo."}, + options + ); + materialMap["gilt-bronze"] = createSculptMaterial( + "gilt-bronze", + {"id": "gilt-bronze", "name": "Gilt bronze fittings", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#C4A46A", "color": "#C4A46A", "albedo": {"dominant": "#C4A46A", "secondary": ["#8A7040", "#E0C890"], "samplingNotes": "Guard, collars, and ring share this yellow-metal family."}, "colorVariation": {"palette": ["#C4A46A", "#8A7040", "#E0C890"], "pattern": "soft-cast-mottle", "amplitude": 0.14, "heightCorrelation": 0.2}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.3, "variation": 0.08, "map": "independent-procedural-field", "localResponse": "duller in engraved recesses on the ring"}, "metalness": {"base": 0.86, "variation": 0.06}, "envMapIntensity": 1.05, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified."}, + options + ); + materialMap["cord-wrap"] = createSculptMaterial( + "cord-wrap", + {"id": "cord-wrap", "name": "Dark cord-wrapped grip", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#3A2418", "color": "#3A2418", "albedo": {"dominant": "#3A2418", "secondary": ["#241610", "#5A3A28"], "samplingNotes": "Dark brown wrap with diamond gilt studs sitting on top."}, "colorVariation": {"palette": ["#241610", "#3A2418", "#5A3A28"], "pattern": "helical-wrap", "amplitude": 0.16, "heightCorrelation": 0.35}, "textureResolution": 1024, "textureProjection": {"mode": "cylindrical", "repeat": [1.0, 8.0], "anisotropy": 4, "texelDensityIntent": "Wrap turns run around the grip, not along the blade."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 3.0, "amplitude": 0.22, "role": "wrap-turn ridges"}, {"id": "meso", "frequency": 12.0, "amplitude": 0.12, "role": "cord twist"}, {"id": "micro", "frequency": 40.0, "amplitude": 0.05, "role": "fiber grit"}], "roughness": {"base": 0.78, "variation": 0.1, "map": "independent-procedural-field", "localResponse": "higher in wrap valleys"}, "metalness": {"base": 0.02, "variation": 0.02}, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.35, "scale": 14.0, "space": "tangent"}, "bump": {"pattern": "cord-wrap", "amplitude": 0.012, "scale": 12.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.4, "contactShadowBias": 0.25, "notes": "Darken wrap valleys and the stud sockets."}, "wear": {"edgeWear": 0.08, "scratches": [], "chips": []}, "dirt": {"amount": 0.12, "cavityBias": 0.4, "color": "#1A100C"}, "localOverrides": [{"id": "wrap-valley", "region": "helical recesses between cord turns", "albedo": "#241610", "roughness": 0.86, "evidenceRefs": ["handle"]}], "shaderNotes": ["Dielectric wrap, not metal.", "Do not reuse albedo as roughness."], "notes": "Dark cord or leather wrap as drawn; blockout is a cylinder plus six inlays."}, + options + ); + materialMap["wrap-seam"] = createSculptMaterial( + "wrap-seam", + {"id": "wrap-seam", "name": "Recessed cord-wrap seam", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#21140E", "color": "#21140E", "albedo": {"dominant": "#21140E", "secondary": ["#160D09", "#322018"], "samplingNotes": "Dark crossing valleys between the illustrated wrap turns."}, "colorVariation": {"palette": ["#241610", "#3A2418", "#5A3A28"], "pattern": "helical-wrap", "amplitude": 0.16, "heightCorrelation": 0.35}, "textureResolution": 1024, "textureProjection": {"mode": "cylindrical", "repeat": [1.0, 8.0], "anisotropy": 4, "texelDensityIntent": "Wrap turns run around the grip, not along the blade."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 3.0, "amplitude": 0.22, "role": "wrap-turn ridges"}, {"id": "meso", "frequency": 12.0, "amplitude": 0.12, "role": "cord twist"}, {"id": "micro", "frequency": 40.0, "amplitude": 0.05, "role": "fiber grit"}], "roughness": {"base": 0.78, "variation": 0.1, "map": "independent-procedural-field", "localResponse": "higher in wrap valleys"}, "metalness": {"base": 0.02, "variation": 0.02}, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.35, "scale": 14.0, "space": "tangent"}, "bump": {"pattern": "cord-wrap", "amplitude": 0.012, "scale": 12.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.4, "contactShadowBias": 0.25, "notes": "Darken wrap valleys and the stud sockets."}, "wear": {"edgeWear": 0.08, "scratches": [], "chips": []}, "dirt": {"amount": 0.12, "cavityBias": 0.4, "color": "#1A100C"}, "localOverrides": [{"id": "wrap-valley", "region": "helical recesses between cord turns", "albedo": "#241610", "roughness": 0.86, "evidenceRefs": ["handle"]}], "shaderNotes": ["Dielectric wrap, not metal.", "Do not reuse albedo as roughness."], "notes": "Thin procedural seam geometry set into the grip surface."}, + options + ); + materialMap["hamon-steel"] = createSculptMaterial( + "hamon-steel", + {"id": "hamon-steel", "name": "Polished hamon line", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#B8BFC6", "color": "#B8BFC6", "albedo": {"dominant": "#B8BFC6", "secondary": ["#9AA2A9", "#C9CED3"], "samplingNotes": "Primary etched hamon: cooler than chrome, not a white highlight rail."}, "colorVariation": {"palette": ["#9AA2A9", "#B8BFC6", "#C9CED3"], "pattern": "fine-etched-line", "amplitude": 0.05, "heightCorrelation": 0.0}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [4.0, 1.0], "anisotropy": 8, "texelDensityIntent": "Keep grind lines running heel-to-tip."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 1.2, "amplitude": 0.12, "role": "broad value along the hamon zone"}, {"id": "meso", "frequency": 8.0, "amplitude": 0.08, "role": "longitudinal grind"}, {"id": "micro", "frequency": 36.0, "amplitude": 0.04, "role": "fine polish grit"}], "roughness": {"base": 0.48, "variation": 0.06, "map": "independent-procedural-field"}, "metalness": {"base": 0.7, "variation": 0.05}, "envMapIntensity": 0.22, "vertexColors": false, "vertexToneFinal": false, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.14, "scale": 22.0, "space": "tangent"}, "bump": {"pattern": "longitudinal-grind", "amplitude": 0.002, "scale": 20.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.18, "contactShadowBias": 0.2, "notes": "Keep the blade bright; only darken the guard and wrap contacts."}, "wear": {"edgeWear": 0.16, "scratches": ["faint heel-to-tip grind"], "chips": []}, "dirt": {"amount": 0.04, "cavityBias": 0.2, "color": "#6A6864"}, "patina": {"amount": 0.0, "color": "#AEB4BA", "notes": "Illustrated as clean steel."}, "localOverrides": [{"id": "hamon-band", "region": "wavy band along the edge, distal two-thirds", "albedo": "#D8DCE0", "roughness": 0.34, "notes": "Hamon is drawn, not a geometry bevel. Blockout keeps it as a value/roughness stain.", "evidenceRefs": ["blade-face"]}, {"id": "edge-brightening", "region": "cutting edge", "albedo": "#E8EBEE", "roughness": 0.2, "evidenceRefs": ["blade-face"]}], "shaderNotes": ["Polished steel: high metalness, mid-low roughness. Not rust, not chrome mirror.", "Do not reuse albedo as roughness."], "notes": "Reconstruct the three-view illustration, not the excavated relic photo."}, + options + ); + materialMap["hamon-steel-secondary"] = createSculptMaterial( + "hamon-steel-secondary", + {"id": "hamon-steel-secondary", "name": "Quiet hamon companion line", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#8E959C", "color": "#8E959C", "albedo": {"dominant": "#8E959C", "secondary": ["#7A8188", "#A4ABB1"], "samplingNotes": "Thinner, darker companion etch; must not compete with the primary hamon."}, "colorVariation": {"palette": ["#7A8188", "#8E959C", "#A4ABB1"], "pattern": "fine-etched-line", "amplitude": 0.04, "heightCorrelation": 0.0}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [4.0, 1.0], "anisotropy": 8, "texelDensityIntent": "Keep grind lines running heel-to-tip."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 1.2, "amplitude": 0.12, "role": "broad value along the hamon zone"}, {"id": "meso", "frequency": 8.0, "amplitude": 0.08, "role": "longitudinal grind"}, {"id": "micro", "frequency": 36.0, "amplitude": 0.04, "role": "fine polish grit"}], "roughness": {"base": 0.58, "variation": 0.05, "map": "independent-procedural-field"}, "metalness": {"base": 0.62, "variation": 0.04}, "envMapIntensity": 0.12, "vertexColors": false, "vertexToneFinal": false, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.14, "scale": 22.0, "space": "tangent"}, "bump": {"pattern": "longitudinal-grind", "amplitude": 0.002, "scale": 20.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.18, "contactShadowBias": 0.2, "notes": "Keep the blade bright; only darken the guard and wrap contacts."}, "wear": {"edgeWear": 0.16, "scratches": ["faint heel-to-tip grind"], "chips": []}, "dirt": {"amount": 0.04, "cavityBias": 0.2, "color": "#6A6864"}, "patina": {"amount": 0.0, "color": "#AEB4BA", "notes": "Illustrated as clean steel."}, "localOverrides": [{"id": "hamon-band", "region": "wavy band along the edge, distal two-thirds", "albedo": "#D8DCE0", "roughness": 0.34, "notes": "Hamon is drawn, not a geometry bevel. Blockout keeps it as a value/roughness stain.", "evidenceRefs": ["blade-face"]}, {"id": "edge-brightening", "region": "cutting edge", "albedo": "#E8EBEE", "roughness": 0.2, "evidenceRefs": ["blade-face"]}], "shaderNotes": ["Polished steel: high metalness, mid-low roughness. Not rust, not chrome mirror.", "Do not reuse albedo as roughness."], "notes": "Reconstruct the three-view illustration, not the excavated relic photo."}, + options + ); + materialMap["gilt-engraving"] = createSculptMaterial( + "gilt-engraving", + {"id": "gilt-engraving", "name": "Dark gilt engraving recess", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#6F5427", "color": "#6F5427", "albedo": {"dominant": "#6F5427", "secondary": ["#4F391A", "#8A7040"], "samplingNotes": "Dark recess tone sampled conceptually from the ring engraving."}, "colorVariation": {"palette": ["#4F391A", "#6F5427", "#8A7040"], "pattern": "engraved-recess", "amplitude": 0.06, "heightCorrelation": 0.0}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.55, "variation": 0.08, "map": "independent-procedural-field"}, "metalness": {"base": 0.86, "variation": 0.06}, "envMapIntensity": 0.25, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified."}, + options + ); + + const nodes: Record = { root }; + const meshes: Record = {}; + const sockets: Record = {}; + const colliders: Record = {}; + const destructionGroups: Record = {}; + + const endpoint_root_0 = makeAttachmentEndpoint(null); + const node_root_0 = new THREE.Group(); + node_root_0.name = "Han Huan-Shou Dao assembly__pivot"; + node_root_0.scale.set(1, 1, 1); + if (endpoint_root_0) { + node_root_0.position.copy(endpoint_root_0.start); + node_root_0.rotation.set(0.0, 0.0, 0.0); + } else { + node_root_0.position.set(0.0, 0.0, 0.0); + node_root_0.rotation.set(0.0, 0.0, 0.0); + } + node_root_0.userData.sculptComponent = {"id": "root", "name": "Han Huan-Shou Dao assembly", "level": "macro", "role": "assembly", "importance": 1.0, "confidence": 0.9, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Assembly pivot only; keep the cube below visibility so it cannot sit on the blade.", "geometryDescriptor": {"topologyIntent": "Han Huan-Shou Dao assembly reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": null, "attachment": null, "dimensions": {"width": 0.001, "height": 0.001, "depth": 0.001, "units": "relative", "confidence": 0.9}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [0.001, 0.001, 0.001]}, "actionProfile": {"animationRole": "root", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [{"id": "blade-heel", "localPosition": [1.814504716981132, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "guard-back", "localPosition": [1.8105389150943394, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "front-ferrule-back", "localPosition": [1.8195247641509433, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "handle-back", "localPosition": [2.1050931603773586, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "rear-ferrule-back", "localPosition": [2.1131544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "pommel-anchor", "localPosition": [2.1996544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}], "collider": {"type": "box", "offset": [1.15, 0, 0], "scale": [2.4, 0.2, 0.08], "isTrigger": false, "notes": "whole-weapon proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "root", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}, "material": "polished-steel", "materialLayers": ["polished-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["full-object"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 200, 204, 1.0)", "secondaryAlbedo": "rgba(154, 160, 166, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.8}}; + node_root_0.userData.actionProfile = {"animationRole": "root", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [{"id": "blade-heel", "localPosition": [1.814504716981132, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "guard-back", "localPosition": [1.8105389150943394, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "front-ferrule-back", "localPosition": [1.8195247641509433, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "handle-back", "localPosition": [2.1050931603773586, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "rear-ferrule-back", "localPosition": [2.1131544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "pommel-anchor", "localPosition": [2.1996544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}], "collider": {"type": "box", "offset": [1.15, 0, 0], "scale": [2.4, 0.2, 0.08], "isTrigger": false, "notes": "whole-weapon proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "root", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}; + node_root_0.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_root_0); + nodes["root"] = node_root_0; + const mesh_root_0Geometry = endpoint_root_0 + ? new THREE.CylinderGeometry(endpoint_root_0.endRadius, endpoint_root_0.baseRadius, endpoint_root_0.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_root_0) { + mesh_root_0Geometry.scale(0.001, 0.001, 0.001); + } + const mesh_root_0 = new THREE.Mesh( + mesh_root_0Geometry, + materialMap["polished-steel"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_root_0.name = "Han Huan-Shou Dao assembly"; + if (endpoint_root_0) { + mesh_root_0.position.copy(endpoint_root_0.midpoint); + mesh_root_0.quaternion.copy(endpoint_root_0.quaternion); + } + mesh_root_0.castShadow = options.castShadow ?? true; + mesh_root_0.receiveShadow = options.receiveShadow ?? true; + mesh_root_0.userData.sculptComponent = {"id": "root", "name": "Han Huan-Shou Dao assembly", "level": "macro", "role": "assembly", "importance": 1.0, "confidence": 0.9, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Assembly pivot only; keep the cube below visibility so it cannot sit on the blade.", "geometryDescriptor": {"topologyIntent": "Han Huan-Shou Dao assembly reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": null, "attachment": null, "dimensions": {"width": 0.001, "height": 0.001, "depth": 0.001, "units": "relative", "confidence": 0.9}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [0.001, 0.001, 0.001]}, "actionProfile": {"animationRole": "root", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [{"id": "blade-heel", "localPosition": [1.814504716981132, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "guard-back", "localPosition": [1.8105389150943394, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "front-ferrule-back", "localPosition": [1.8195247641509433, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "handle-back", "localPosition": [2.1050931603773586, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "rear-ferrule-back", "localPosition": [2.1131544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}, {"id": "pommel-anchor", "localPosition": [2.1996544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}], "collider": {"type": "box", "offset": [1.15, 0, 0], "scale": [2.4, 0.2, 0.08], "isTrigger": false, "notes": "whole-weapon proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "root", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}, "material": "polished-steel", "materialLayers": ["polished-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["full-object"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 200, 204, 1.0)", "secondaryAlbedo": "rgba(154, 160, 166, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.8}}; + mesh_root_0.userData.explodeWithParent = null; + node_root_0.add(mesh_root_0); + meshes["root"] = mesh_root_0; + colliders["root"] = {"type": "box", "offset": [1.15, 0, 0], "scale": [2.4, 0.2, 0.08], "isTrigger": false, "notes": "whole-weapon proxy"}; + destructionGroups["root"] ??= []; + destructionGroups["root"].push(node_root_0); + const socket_root_blade_heel_0 = new THREE.Object3D(); + socket_root_blade_heel_0.name = "blade-heel"; + socket_root_blade_heel_0.position.set(1.814504716981132, 0.0, 0.0); + socket_root_blade_heel_0.rotation.set(0.0, 0.0, 0.0); + socket_root_blade_heel_0.userData.socket = {"id": "blade-heel", "localPosition": [1.814504716981132, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_blade_heel_0); + sockets["root:blade-heel"] = socket_root_blade_heel_0; + const socket_root_guard_back_1 = new THREE.Object3D(); + socket_root_guard_back_1.name = "guard-back"; + socket_root_guard_back_1.position.set(1.8105389150943394, 0.0, 0.0); + socket_root_guard_back_1.rotation.set(0.0, 0.0, 0.0); + socket_root_guard_back_1.userData.socket = {"id": "guard-back", "localPosition": [1.8105389150943394, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_guard_back_1); + sockets["root:guard-back"] = socket_root_guard_back_1; + const socket_root_front_ferrule_back_2 = new THREE.Object3D(); + socket_root_front_ferrule_back_2.name = "front-ferrule-back"; + socket_root_front_ferrule_back_2.position.set(1.8195247641509433, 0.0, 0.0); + socket_root_front_ferrule_back_2.rotation.set(0.0, 0.0, 0.0); + socket_root_front_ferrule_back_2.userData.socket = {"id": "front-ferrule-back", "localPosition": [1.8195247641509433, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_front_ferrule_back_2); + sockets["root:front-ferrule-back"] = socket_root_front_ferrule_back_2; + const socket_root_handle_back_3 = new THREE.Object3D(); + socket_root_handle_back_3.name = "handle-back"; + socket_root_handle_back_3.position.set(2.1050931603773586, 0.0, 0.0); + socket_root_handle_back_3.rotation.set(0.0, 0.0, 0.0); + socket_root_handle_back_3.userData.socket = {"id": "handle-back", "localPosition": [2.1050931603773586, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_handle_back_3); + sockets["root:handle-back"] = socket_root_handle_back_3; + const socket_root_rear_ferrule_back_4 = new THREE.Object3D(); + socket_root_rear_ferrule_back_4.name = "rear-ferrule-back"; + socket_root_rear_ferrule_back_4.position.set(2.1131544811320757, 0.0, 0.0); + socket_root_rear_ferrule_back_4.rotation.set(0.0, 0.0, 0.0); + socket_root_rear_ferrule_back_4.userData.socket = {"id": "rear-ferrule-back", "localPosition": [2.1131544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_rear_ferrule_back_4); + sockets["root:rear-ferrule-back"] = socket_root_rear_ferrule_back_4; + const socket_root_pommel_anchor_5 = new THREE.Object3D(); + socket_root_pommel_anchor_5.name = "pommel-anchor"; + socket_root_pommel_anchor_5.position.set(2.1996544811320757, 0.0, 0.0); + socket_root_pommel_anchor_5.rotation.set(0.0, 0.0, 0.0); + socket_root_pommel_anchor_5.userData.socket = {"id": "pommel-anchor", "localPosition": [2.1996544811320757, 0.0, 0.0], "localRotation": [0.0, 0.0, 0.0]}; + node_root_0.add(socket_root_pommel_anchor_5); + sockets["root:pommel-anchor"] = socket_root_pommel_anchor_5; + + const endpoint_blade_1 = makeAttachmentEndpoint(null); + const node_blade_1 = new THREE.Group(); + node_blade_1.name = "Dao blade__pivot"; + node_blade_1.scale.set(1, 1, 1); + if (endpoint_blade_1) { + node_blade_1.position.copy(endpoint_blade_1.start); + node_blade_1.rotation.set(0.0, 3.141592653589793, 0.0); + } else { + node_blade_1.position.set(1.814504716981132, 0.0, 0.0); + node_blade_1.rotation.set(0.0, 3.141592653589793, 0.0); + } + node_blade_1.userData.sculptComponent = {"id": "blade", "name": "Dao blade", "level": "macro", "role": "blade", "importance": 1.0, "confidence": 0.88, "primitive": "ground-blade", "topologyClass": "assembled-solid", "topologyRationale": "Single-edged bar lofted from the face-view stations; tip climbs to the spine. Not a rusted card and not a jian diamond.", "geometryDescriptor": {"topologyIntent": "Dao blade reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.003, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "bladeSpec": {"stations": [[0.0, 0.051533018867924524, -0.04882075471698113], [0.1952830188679245, 0.05017688679245283, -0.051533018867924524], [0.39870283018867925, 0.04882075471698113, -0.05424528301886792], [0.5885613207547169, 0.04882075471698113, -0.05560141509433962], [0.7784198113207547, 0.047464622641509434, -0.05560141509433962], [0.9411556603773584, 0.047464622641509434, -0.05424528301886792], [1.0767688679245282, 0.04610849056603773, -0.052889150943396225], [1.1852594339622642, 0.04610849056603773, -0.051533018867924524], [1.266627358490566, 0.04475235849056604, -0.05017688679245283], [1.347995283018868, 0.04475235849056604, -0.047464622641509434], [1.4022405660377357, 0.04339622641509434, -0.04610849056603773], [1.4564858490566037, 0.04339622641509434, -0.04339622641509434], [1.5107311320754715, 0.042040094339622636, -0.04068396226415094], [1.5514150943396225, 0.04068396226415094, -0.036615566037735844], [1.5920990566037734, 0.04068396226415094, -0.032547169811320754], [1.6327830188679244, 0.03932783018867924, -0.02712264150943396], [1.6734669811320753, 0.037971698113207546, -0.018985849056603773], [1.7005896226415094, 0.037971698113207546, -0.012205188679245282], [1.7277122641509433, 0.036615566037735844, -0.002712264150943396], [1.7548349056603771, 0.036615566037735844, 0.00678066037735849], [1.7711084905660377, 0.03525943396226415, 0.01356132075471698], [1.787382075471698, 0.03525943396226415, 0.02169811320754717], [1.800943396226415, 0.03525943396226415, 0.028478773584905658], [1.814504716981132, 0.03525943396226415, 0.03525943396226415]], "thickness": 0.0502, "thicknesses": [0.0502, 0.0488, 0.0475, 0.0461, 0.0448, 0.0434, 0.042, 0.0393, 0.0366, 0.0339, 0.0312, 0.0285, 0.0258, 0.0231, 0.0203, 0.0176, 0.0149, 0.0122, 0.0095, 0.0075, 0.0054, 0.0034, 0.0014, 0.0], "grindFrac": 0.42, "swedgeFromTipFrac": 0.0, "edgeTone": 0.58}}, "parent": "root", "attachment": null, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.88}, "transform": {"position": [1.814504716981132, 0.0, 0.0], "rotation": [0.0, 3.141592653589793, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "box", "offset": [0.907252358490566, 0, 0], "scale": [1.814504716981132, 0.11, 0.05], "isTrigger": false, "notes": "blade proxy in local heel-to-tip X"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}, "material": "polished-steel", "materialLayers": ["polished-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "distal-taper", "kind": "bevel", "notes": "Edge rises to meet the spine; last stations collapse to a point."}, {"id": "edge-grind", "kind": "bevel", "notes": "Primary bevel on -Y from the side view thickness."}], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["full-object", "blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 200, 204, 1.0)", "secondaryAlbedo": "rgba(228, 231, 234, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84, "colorGradient": {"type": "linear", "stops": [{"offset": 0.0, "color": "rgba(154, 160, 166, 1.0)"}, {"offset": 0.55, "color": "rgba(196, 200, 204, 1.0)"}, {"offset": 1.0, "color": "rgba(228, 231, 234, 1.0)"}]}}}; + node_blade_1.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "box", "offset": [0.907252358490566, 0, 0], "scale": [1.814504716981132, 0.11, 0.05], "isTrigger": false, "notes": "blade proxy in local heel-to-tip X"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}; + node_blade_1.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_blade_1); + nodes["blade"] = node_blade_1; + const mesh_blade_1Geometry = endpoint_blade_1 + ? new THREE.CylinderGeometry(endpoint_blade_1.endRadius, endpoint_blade_1.baseRadius, endpoint_blade_1.length, 32, 12) + : buildGroundBladeGeometry({"stations": [[0.0, 0.051533018867924524, -0.04882075471698113], [0.1952830188679245, 0.05017688679245283, -0.051533018867924524], [0.39870283018867925, 0.04882075471698113, -0.05424528301886792], [0.5885613207547169, 0.04882075471698113, -0.05560141509433962], [0.7784198113207547, 0.047464622641509434, -0.05560141509433962], [0.9411556603773584, 0.047464622641509434, -0.05424528301886792], [1.0767688679245282, 0.04610849056603773, -0.052889150943396225], [1.1852594339622642, 0.04610849056603773, -0.051533018867924524], [1.266627358490566, 0.04475235849056604, -0.05017688679245283], [1.347995283018868, 0.04475235849056604, -0.047464622641509434], [1.4022405660377357, 0.04339622641509434, -0.04610849056603773], [1.4564858490566037, 0.04339622641509434, -0.04339622641509434], [1.5107311320754715, 0.042040094339622636, -0.04068396226415094], [1.5514150943396225, 0.04068396226415094, -0.036615566037735844], [1.5920990566037734, 0.04068396226415094, -0.032547169811320754], [1.6327830188679244, 0.03932783018867924, -0.02712264150943396], [1.6734669811320753, 0.037971698113207546, -0.018985849056603773], [1.7005896226415094, 0.037971698113207546, -0.012205188679245282], [1.7277122641509433, 0.036615566037735844, -0.002712264150943396], [1.7548349056603771, 0.036615566037735844, 0.00678066037735849], [1.7711084905660377, 0.03525943396226415, 0.01356132075471698], [1.787382075471698, 0.03525943396226415, 0.02169811320754717], [1.800943396226415, 0.03525943396226415, 0.028478773584905658], [1.814504716981132, 0.03525943396226415, 0.03525943396226415]], "thickness": 0.0502, "thicknesses": [0.0502, 0.0488, 0.0475, 0.0461, 0.0448, 0.0434, 0.042, 0.0393, 0.0366, 0.0339, 0.0312, 0.0285, 0.0258, 0.0231, 0.0203, 0.0176, 0.0149, 0.0122, 0.0095, 0.0075, 0.0054, 0.0034, 0.0014, 0.0], "grindFrac": 0.42, "swedgeFromTipFrac": 0.0, "edgeTone": 0.58}); + if (!endpoint_blade_1) { + mesh_blade_1Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_blade_1 = new THREE.Mesh( + mesh_blade_1Geometry, + materialMap["polished-steel"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_blade_1.name = "Dao blade"; + if (endpoint_blade_1) { + mesh_blade_1.position.copy(endpoint_blade_1.midpoint); + mesh_blade_1.quaternion.copy(endpoint_blade_1.quaternion); + } + mesh_blade_1.castShadow = options.castShadow ?? true; + mesh_blade_1.receiveShadow = options.receiveShadow ?? true; + mesh_blade_1.userData.sculptComponent = {"id": "blade", "name": "Dao blade", "level": "macro", "role": "blade", "importance": 1.0, "confidence": 0.88, "primitive": "ground-blade", "topologyClass": "assembled-solid", "topologyRationale": "Single-edged bar lofted from the face-view stations; tip climbs to the spine. Not a rusted card and not a jian diamond.", "geometryDescriptor": {"topologyIntent": "Dao blade reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.003, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "bladeSpec": {"stations": [[0.0, 0.051533018867924524, -0.04882075471698113], [0.1952830188679245, 0.05017688679245283, -0.051533018867924524], [0.39870283018867925, 0.04882075471698113, -0.05424528301886792], [0.5885613207547169, 0.04882075471698113, -0.05560141509433962], [0.7784198113207547, 0.047464622641509434, -0.05560141509433962], [0.9411556603773584, 0.047464622641509434, -0.05424528301886792], [1.0767688679245282, 0.04610849056603773, -0.052889150943396225], [1.1852594339622642, 0.04610849056603773, -0.051533018867924524], [1.266627358490566, 0.04475235849056604, -0.05017688679245283], [1.347995283018868, 0.04475235849056604, -0.047464622641509434], [1.4022405660377357, 0.04339622641509434, -0.04610849056603773], [1.4564858490566037, 0.04339622641509434, -0.04339622641509434], [1.5107311320754715, 0.042040094339622636, -0.04068396226415094], [1.5514150943396225, 0.04068396226415094, -0.036615566037735844], [1.5920990566037734, 0.04068396226415094, -0.032547169811320754], [1.6327830188679244, 0.03932783018867924, -0.02712264150943396], [1.6734669811320753, 0.037971698113207546, -0.018985849056603773], [1.7005896226415094, 0.037971698113207546, -0.012205188679245282], [1.7277122641509433, 0.036615566037735844, -0.002712264150943396], [1.7548349056603771, 0.036615566037735844, 0.00678066037735849], [1.7711084905660377, 0.03525943396226415, 0.01356132075471698], [1.787382075471698, 0.03525943396226415, 0.02169811320754717], [1.800943396226415, 0.03525943396226415, 0.028478773584905658], [1.814504716981132, 0.03525943396226415, 0.03525943396226415]], "thickness": 0.0502, "thicknesses": [0.0502, 0.0488, 0.0475, 0.0461, 0.0448, 0.0434, 0.042, 0.0393, 0.0366, 0.0339, 0.0312, 0.0285, 0.0258, 0.0231, 0.0203, 0.0176, 0.0149, 0.0122, 0.0095, 0.0075, 0.0054, 0.0034, 0.0014, 0.0], "grindFrac": 0.42, "swedgeFromTipFrac": 0.0, "edgeTone": 0.58}}, "parent": "root", "attachment": null, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.88}, "transform": {"position": [1.814504716981132, 0.0, 0.0], "rotation": [0.0, 3.141592653589793, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "box", "offset": [0.907252358490566, 0, 0], "scale": [1.814504716981132, 0.11, 0.05], "isTrigger": false, "notes": "blade proxy in local heel-to-tip X"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "polished-steel"}}, "material": "polished-steel", "materialLayers": ["polished-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "distal-taper", "kind": "bevel", "notes": "Edge rises to meet the spine; last stations collapse to a point."}, {"id": "edge-grind", "kind": "bevel", "notes": "Primary bevel on -Y from the side view thickness."}], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["full-object", "blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 200, 204, 1.0)", "secondaryAlbedo": "rgba(228, 231, 234, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84, "colorGradient": {"type": "linear", "stops": [{"offset": 0.0, "color": "rgba(154, 160, 166, 1.0)"}, {"offset": 0.55, "color": "rgba(196, 200, 204, 1.0)"}, {"offset": 1.0, "color": "rgba(228, 231, 234, 1.0)"}]}}}; + mesh_blade_1.userData.explodeWithParent = null; + node_blade_1.add(mesh_blade_1); + meshes["blade"] = mesh_blade_1; + colliders["blade"] = {"type": "box", "offset": [0.907252358490566, 0, 0], "scale": [1.814504716981132, 0.11, 0.05], "isTrigger": false, "notes": "blade proxy in local heel-to-tip X"}; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_blade_1); + + const attachment_hamon_1_2 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_1_2 = makeAttachmentEndpoint(attachment_hamon_1_2); + const node_hamon_1_2 = new THREE.Group(); + node_hamon_1_2.name = "Hamon front line 1__pivot"; + node_hamon_1_2.scale.set(1, 1, 1); + if (endpoint_hamon_1_2) { + node_hamon_1_2.position.copy(endpoint_hamon_1_2.start); + node_hamon_1_2.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_1_2.position.set(0.0, 0.0, 0.0); + node_hamon_1_2.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_1_2.userData.sculptComponent = {"id": "hamon-1", "name": "Hamon front line 1", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.00819, 0.01291], [0.33333, 0.00804, 0.01444], [0.38667, 0.0077, 0.01576], [0.44, 0.00764, 0.01709], [0.49333, 0.00762, 0.0182], [0.54667, 0.00689, 0.01908], [0.6, 0.00682, 0.01996], [0.65333, 0.00644, 0.02075], [0.70667, 0.00591, 0.02141], [0.76, 0.00593, 0.02191], [0.81333, 0.00666, 0.02219], [0.86667, 0.00773, 0.02247], [0.92, 0.00851, 0.0227], [0.97333, 0.00895, 0.02293], [1.02667, 0.00893, 0.02316], [1.08, 0.00886, 0.02335], [1.13333, 0.00867, 0.02353], [1.18667, 0.00845, 0.02372], [1.24, 0.00823, 0.0239], [1.29333, 0.00793, 0.0241], [1.34667, 0.00764, 0.0243], [1.4, 0.00743, 0.02449], [1.45333, 0.00766, 0.02467], [1.50667, 0.00822, 0.02484], [1.56, 0.00895, 0.02501], [1.61333, 0.00972, 0.02518], [1.66667, 0.01041, 0.02537], [1.72, 0.01095, 0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + node_hamon_1_2.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}; + node_hamon_1_2.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_1_2); + nodes["hamon-1"] = node_hamon_1_2; + const mesh_hamon_1_2Geometry = endpoint_hamon_1_2 + ? new THREE.CylinderGeometry(endpoint_hamon_1_2.endRadius, endpoint_hamon_1_2.baseRadius, endpoint_hamon_1_2.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.00819, 0.01291], [0.33333, 0.00804, 0.01444], [0.38667, 0.0077, 0.01576], [0.44, 0.00764, 0.01709], [0.49333, 0.00762, 0.0182], [0.54667, 0.00689, 0.01908], [0.6, 0.00682, 0.01996], [0.65333, 0.00644, 0.02075], [0.70667, 0.00591, 0.02141], [0.76, 0.00593, 0.02191], [0.81333, 0.00666, 0.02219], [0.86667, 0.00773, 0.02247], [0.92, 0.00851, 0.0227], [0.97333, 0.00895, 0.02293], [1.02667, 0.00893, 0.02316], [1.08, 0.00886, 0.02335], [1.13333, 0.00867, 0.02353], [1.18667, 0.00845, 0.02372], [1.24, 0.00823, 0.0239], [1.29333, 0.00793, 0.0241], [1.34667, 0.00764, 0.0243], [1.4, 0.00743, 0.02449], [1.45333, 0.00766, 0.02467], [1.50667, 0.00822, 0.02484], [1.56, 0.00895, 0.02501], [1.61333, 0.00972, 0.02518], [1.66667, 0.01041, 0.02537], [1.72, 0.01095, 0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_1_2) { + mesh_hamon_1_2Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_1_2 = new THREE.Mesh( + mesh_hamon_1_2Geometry, + materialMap["hamon-steel-secondary"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_1_2.name = "Hamon front line 1"; + if (endpoint_hamon_1_2) { + mesh_hamon_1_2.position.copy(endpoint_hamon_1_2.midpoint); + mesh_hamon_1_2.quaternion.copy(endpoint_hamon_1_2.quaternion); + } + mesh_hamon_1_2.castShadow = options.castShadow ?? true; + mesh_hamon_1_2.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_1_2.userData.sculptComponent = {"id": "hamon-1", "name": "Hamon front line 1", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.00819, 0.01291], [0.33333, 0.00804, 0.01444], [0.38667, 0.0077, 0.01576], [0.44, 0.00764, 0.01709], [0.49333, 0.00762, 0.0182], [0.54667, 0.00689, 0.01908], [0.6, 0.00682, 0.01996], [0.65333, 0.00644, 0.02075], [0.70667, 0.00591, 0.02141], [0.76, 0.00593, 0.02191], [0.81333, 0.00666, 0.02219], [0.86667, 0.00773, 0.02247], [0.92, 0.00851, 0.0227], [0.97333, 0.00895, 0.02293], [1.02667, 0.00893, 0.02316], [1.08, 0.00886, 0.02335], [1.13333, 0.00867, 0.02353], [1.18667, 0.00845, 0.02372], [1.24, 0.00823, 0.0239], [1.29333, 0.00793, 0.0241], [1.34667, 0.00764, 0.0243], [1.4, 0.00743, 0.02449], [1.45333, 0.00766, 0.02467], [1.50667, 0.00822, 0.02484], [1.56, 0.00895, 0.02501], [1.61333, 0.00972, 0.02518], [1.66667, 0.01041, 0.02537], [1.72, 0.01095, 0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + mesh_hamon_1_2.userData.explodeWithParent = "blade"; + node_hamon_1_2.add(mesh_hamon_1_2); + meshes["hamon-1"] = mesh_hamon_1_2; + colliders["hamon-1"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_1_2); + + const attachment_hamon_2_3 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_2_3 = makeAttachmentEndpoint(attachment_hamon_2_3); + const node_hamon_2_3 = new THREE.Group(); + node_hamon_2_3.name = "Hamon front line 2__pivot"; + node_hamon_2_3.scale.set(1, 1, 1); + if (endpoint_hamon_2_3) { + node_hamon_2_3.position.copy(endpoint_hamon_2_3.start); + node_hamon_2_3.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_2_3.position.set(0.0, 0.0, 0.0); + node_hamon_2_3.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_2_3.userData.sculptComponent = {"id": "hamon-2", "name": "Hamon front line 2", "level": "micro", "role": "detail", "importance": 0.78, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.01579, 0.01291], [0.33333, 0.01564, 0.01444], [0.38667, 0.01526, 0.01576], [0.44, 0.01511, 0.01709], [0.49333, 0.01495, 0.0182], [0.54667, 0.01408, 0.01908], [0.6, 0.01391, 0.01996], [0.65333, 0.01354, 0.02075], [0.70667, 0.01328, 0.02141], [0.76, 0.01392, 0.02191], [0.81333, 0.01559, 0.02219], [0.86667, 0.01765, 0.02247], [0.92, 0.01911, 0.0227], [0.97333, 0.01957, 0.02293], [1.02667, 0.01881, 0.02316], [1.08, 0.01746, 0.02335], [1.13333, 0.01583, 0.02353], [1.18667, 0.01445, 0.02372], [1.24, 0.01355, 0.0239], [1.29333, 0.01308, 0.0241], [1.34667, 0.01298, 0.0243], [1.4, 0.01318, 0.02449], [1.45333, 0.01389, 0.02467], [1.50667, 0.01495, 0.02484], [1.56, 0.01612, 0.02501], [1.61333, 0.01718, 0.02518], [1.66667, 0.01799, 0.02537], [1.72, 0.01855, 0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}, "material": "hamon-steel", "materialLayers": ["hamon-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(184, 191, 198, 1.0)", "secondaryAlbedo": "rgba(154, 162, 169, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.72}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + node_hamon_2_3.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}; + node_hamon_2_3.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_2_3); + nodes["hamon-2"] = node_hamon_2_3; + const mesh_hamon_2_3Geometry = endpoint_hamon_2_3 + ? new THREE.CylinderGeometry(endpoint_hamon_2_3.endRadius, endpoint_hamon_2_3.baseRadius, endpoint_hamon_2_3.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.01579, 0.01291], [0.33333, 0.01564, 0.01444], [0.38667, 0.01526, 0.01576], [0.44, 0.01511, 0.01709], [0.49333, 0.01495, 0.0182], [0.54667, 0.01408, 0.01908], [0.6, 0.01391, 0.01996], [0.65333, 0.01354, 0.02075], [0.70667, 0.01328, 0.02141], [0.76, 0.01392, 0.02191], [0.81333, 0.01559, 0.02219], [0.86667, 0.01765, 0.02247], [0.92, 0.01911, 0.0227], [0.97333, 0.01957, 0.02293], [1.02667, 0.01881, 0.02316], [1.08, 0.01746, 0.02335], [1.13333, 0.01583, 0.02353], [1.18667, 0.01445, 0.02372], [1.24, 0.01355, 0.0239], [1.29333, 0.01308, 0.0241], [1.34667, 0.01298, 0.0243], [1.4, 0.01318, 0.02449], [1.45333, 0.01389, 0.02467], [1.50667, 0.01495, 0.02484], [1.56, 0.01612, 0.02501], [1.61333, 0.01718, 0.02518], [1.66667, 0.01799, 0.02537], [1.72, 0.01855, 0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_2_3) { + mesh_hamon_2_3Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_2_3 = new THREE.Mesh( + mesh_hamon_2_3Geometry, + materialMap["hamon-steel"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_2_3.name = "Hamon front line 2"; + if (endpoint_hamon_2_3) { + mesh_hamon_2_3.position.copy(endpoint_hamon_2_3.midpoint); + mesh_hamon_2_3.quaternion.copy(endpoint_hamon_2_3.quaternion); + } + mesh_hamon_2_3.castShadow = options.castShadow ?? true; + mesh_hamon_2_3.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_2_3.userData.sculptComponent = {"id": "hamon-2", "name": "Hamon front line 2", "level": "micro", "role": "detail", "importance": 0.78, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.01579, 0.01291], [0.33333, 0.01564, 0.01444], [0.38667, 0.01526, 0.01576], [0.44, 0.01511, 0.01709], [0.49333, 0.01495, 0.0182], [0.54667, 0.01408, 0.01908], [0.6, 0.01391, 0.01996], [0.65333, 0.01354, 0.02075], [0.70667, 0.01328, 0.02141], [0.76, 0.01392, 0.02191], [0.81333, 0.01559, 0.02219], [0.86667, 0.01765, 0.02247], [0.92, 0.01911, 0.0227], [0.97333, 0.01957, 0.02293], [1.02667, 0.01881, 0.02316], [1.08, 0.01746, 0.02335], [1.13333, 0.01583, 0.02353], [1.18667, 0.01445, 0.02372], [1.24, 0.01355, 0.0239], [1.29333, 0.01308, 0.0241], [1.34667, 0.01298, 0.0243], [1.4, 0.01318, 0.02449], [1.45333, 0.01389, 0.02467], [1.50667, 0.01495, 0.02484], [1.56, 0.01612, 0.02501], [1.61333, 0.01718, 0.02518], [1.66667, 0.01799, 0.02537], [1.72, 0.01855, 0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}, "material": "hamon-steel", "materialLayers": ["hamon-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(184, 191, 198, 1.0)", "secondaryAlbedo": "rgba(154, 162, 169, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.72}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + mesh_hamon_2_3.userData.explodeWithParent = "blade"; + node_hamon_2_3.add(mesh_hamon_2_3); + meshes["hamon-2"] = mesh_hamon_2_3; + colliders["hamon-2"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_2_3); + + const attachment_hamon_3_4 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_3_4 = makeAttachmentEndpoint(attachment_hamon_3_4); + const node_hamon_3_4 = new THREE.Group(); + node_hamon_3_4.name = "Hamon front line 3__pivot"; + node_hamon_3_4.scale.set(1, 1, 1); + if (endpoint_hamon_3_4) { + node_hamon_3_4.position.copy(endpoint_hamon_3_4.start); + node_hamon_3_4.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_3_4.position.set(0.0, 0.0, 0.0); + node_hamon_3_4.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_3_4.userData.sculptComponent = {"id": "hamon-3", "name": "Hamon front line 3", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.02459, 0.01291], [0.33333, 0.02439, 0.01444], [0.38667, 0.02392, 0.01576], [0.44, 0.02372, 0.01709], [0.49333, 0.02369, 0.0182], [0.54667, 0.0232, 0.01908], [0.6, 0.02361, 0.01996], [0.65333, 0.02385, 0.02075], [0.70667, 0.02385, 0.02141], [0.76, 0.02411, 0.02191], [0.81333, 0.02468, 0.02219], [0.86667, 0.02519, 0.02247], [0.92, 0.02513, 0.0227], [0.97333, 0.02459, 0.02293], [1.02667, 0.02361, 0.02316], [1.08, 0.02273, 0.02335], [1.13333, 0.02201, 0.02353], [1.18667, 0.02168, 0.02372], [1.24, 0.02179, 0.0239], [1.29333, 0.02222, 0.0241], [1.34667, 0.02285, 0.0243], [1.4, 0.02349, 0.02449], [1.45333, 0.0243, 0.02467], [1.50667, 0.02509, 0.02484], [1.56, 0.02577, 0.02501], [1.61333, 0.02635, 0.02518], [1.66667, 0.02687, 0.02537], [1.72, 0.02735, 0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + node_hamon_3_4.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}; + node_hamon_3_4.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_3_4); + nodes["hamon-3"] = node_hamon_3_4; + const mesh_hamon_3_4Geometry = endpoint_hamon_3_4 + ? new THREE.CylinderGeometry(endpoint_hamon_3_4.endRadius, endpoint_hamon_3_4.baseRadius, endpoint_hamon_3_4.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.02459, 0.01291], [0.33333, 0.02439, 0.01444], [0.38667, 0.02392, 0.01576], [0.44, 0.02372, 0.01709], [0.49333, 0.02369, 0.0182], [0.54667, 0.0232, 0.01908], [0.6, 0.02361, 0.01996], [0.65333, 0.02385, 0.02075], [0.70667, 0.02385, 0.02141], [0.76, 0.02411, 0.02191], [0.81333, 0.02468, 0.02219], [0.86667, 0.02519, 0.02247], [0.92, 0.02513, 0.0227], [0.97333, 0.02459, 0.02293], [1.02667, 0.02361, 0.02316], [1.08, 0.02273, 0.02335], [1.13333, 0.02201, 0.02353], [1.18667, 0.02168, 0.02372], [1.24, 0.02179, 0.0239], [1.29333, 0.02222, 0.0241], [1.34667, 0.02285, 0.0243], [1.4, 0.02349, 0.02449], [1.45333, 0.0243, 0.02467], [1.50667, 0.02509, 0.02484], [1.56, 0.02577, 0.02501], [1.61333, 0.02635, 0.02518], [1.66667, 0.02687, 0.02537], [1.72, 0.02735, 0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_3_4) { + mesh_hamon_3_4Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_3_4 = new THREE.Mesh( + mesh_hamon_3_4Geometry, + materialMap["hamon-steel-secondary"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_3_4.name = "Hamon front line 3"; + if (endpoint_hamon_3_4) { + mesh_hamon_3_4.position.copy(endpoint_hamon_3_4.midpoint); + mesh_hamon_3_4.quaternion.copy(endpoint_hamon_3_4.quaternion); + } + mesh_hamon_3_4.castShadow = options.castShadow ?? true; + mesh_hamon_3_4.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_3_4.userData.sculptComponent = {"id": "hamon-3", "name": "Hamon front line 3", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.78, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the front face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon front line 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.02459, 0.01291], [0.33333, 0.02439, 0.01444], [0.38667, 0.02392, 0.01576], [0.44, 0.02372, 0.01709], [0.49333, 0.02369, 0.0182], [0.54667, 0.0232, 0.01908], [0.6, 0.02361, 0.01996], [0.65333, 0.02385, 0.02075], [0.70667, 0.02385, 0.02141], [0.76, 0.02411, 0.02191], [0.81333, 0.02468, 0.02219], [0.86667, 0.02519, 0.02247], [0.92, 0.02513, 0.0227], [0.97333, 0.02459, 0.02293], [1.02667, 0.02361, 0.02316], [1.08, 0.02273, 0.02335], [1.13333, 0.02201, 0.02353], [1.18667, 0.02168, 0.02372], [1.24, 0.02179, 0.0239], [1.29333, 0.02222, 0.0241], [1.34667, 0.02285, 0.0243], [1.4, 0.02349, 0.02449], [1.45333, 0.0243, 0.02467], [1.50667, 0.02509, 0.02484], [1.56, 0.02577, 0.02501], [1.61333, 0.02635, 0.02518], [1.66667, 0.02687, 0.02537], [1.72, 0.02735, 0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.78}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "front", "mergePolicy": "bake"}; + mesh_hamon_3_4.userData.explodeWithParent = "blade"; + node_hamon_3_4.add(mesh_hamon_3_4); + meshes["hamon-3"] = mesh_hamon_3_4; + colliders["hamon-3"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_3_4); + + const attachment_hamon_back_1_5 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_back_1_5 = makeAttachmentEndpoint(attachment_hamon_back_1_5); + const node_hamon_back_1_5 = new THREE.Group(); + node_hamon_back_1_5.name = "Hamon back line 1__pivot"; + node_hamon_back_1_5.scale.set(1, 1, 1); + if (endpoint_hamon_back_1_5) { + node_hamon_back_1_5.position.copy(endpoint_hamon_back_1_5.start); + node_hamon_back_1_5.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_back_1_5.position.set(0.0, 0.0, 0.0); + node_hamon_back_1_5.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_back_1_5.userData.sculptComponent = {"id": "hamon-back-1", "name": "Hamon back line 1", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.00819, -0.01291], [0.33333, 0.00802, -0.01444], [0.38667, 0.00763, -0.01576], [0.44, 0.00748, -0.01709], [0.49333, 0.00738, -0.0182], [0.54667, 0.00665, -0.01908], [0.6, 0.00668, -0.01996], [0.65333, 0.00649, -0.02075], [0.70667, 0.00621, -0.02141], [0.76, 0.00649, -0.02191], [0.81333, 0.00743, -0.02219], [0.86667, 0.0086, -0.02247], [0.92, 0.00934, -0.0227], [0.97333, 0.00956, -0.02293], [1.02667, 0.00918, -0.02316], [1.08, 0.00864, -0.02335], [1.13333, 0.00798, -0.02353], [1.18667, 0.00742, -0.02372], [1.24, 0.00707, -0.0239], [1.29333, 0.00684, -0.0241], [1.34667, 0.0068, -0.0243], [1.4, 0.0069, -0.02449], [1.45333, 0.0074, -0.02467], [1.50667, 0.00816, -0.02484], [1.56, 0.00898, -0.02501], [1.61333, 0.00976, -0.02518], [1.66667, 0.01042, -0.02537], [1.72, 0.01095, -0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + node_hamon_back_1_5.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}; + node_hamon_back_1_5.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_back_1_5); + nodes["hamon-back-1"] = node_hamon_back_1_5; + const mesh_hamon_back_1_5Geometry = endpoint_hamon_back_1_5 + ? new THREE.CylinderGeometry(endpoint_hamon_back_1_5.endRadius, endpoint_hamon_back_1_5.baseRadius, endpoint_hamon_back_1_5.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.00819, -0.01291], [0.33333, 0.00802, -0.01444], [0.38667, 0.00763, -0.01576], [0.44, 0.00748, -0.01709], [0.49333, 0.00738, -0.0182], [0.54667, 0.00665, -0.01908], [0.6, 0.00668, -0.01996], [0.65333, 0.00649, -0.02075], [0.70667, 0.00621, -0.02141], [0.76, 0.00649, -0.02191], [0.81333, 0.00743, -0.02219], [0.86667, 0.0086, -0.02247], [0.92, 0.00934, -0.0227], [0.97333, 0.00956, -0.02293], [1.02667, 0.00918, -0.02316], [1.08, 0.00864, -0.02335], [1.13333, 0.00798, -0.02353], [1.18667, 0.00742, -0.02372], [1.24, 0.00707, -0.0239], [1.29333, 0.00684, -0.0241], [1.34667, 0.0068, -0.0243], [1.4, 0.0069, -0.02449], [1.45333, 0.0074, -0.02467], [1.50667, 0.00816, -0.02484], [1.56, 0.00898, -0.02501], [1.61333, 0.00976, -0.02518], [1.66667, 0.01042, -0.02537], [1.72, 0.01095, -0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_back_1_5) { + mesh_hamon_back_1_5Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_back_1_5 = new THREE.Mesh( + mesh_hamon_back_1_5Geometry, + materialMap["hamon-steel-secondary"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_back_1_5.name = "Hamon back line 1"; + if (endpoint_hamon_back_1_5) { + mesh_hamon_back_1_5.position.copy(endpoint_hamon_back_1_5.midpoint); + mesh_hamon_back_1_5.quaternion.copy(endpoint_hamon_back_1_5.quaternion); + } + mesh_hamon_back_1_5.castShadow = options.castShadow ?? true; + mesh_hamon_back_1_5.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_back_1_5.userData.sculptComponent = {"id": "hamon-back-1", "name": "Hamon back line 1", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.00819, -0.01291], [0.33333, 0.00802, -0.01444], [0.38667, 0.00763, -0.01576], [0.44, 0.00748, -0.01709], [0.49333, 0.00738, -0.0182], [0.54667, 0.00665, -0.01908], [0.6, 0.00668, -0.01996], [0.65333, 0.00649, -0.02075], [0.70667, 0.00621, -0.02141], [0.76, 0.00649, -0.02191], [0.81333, 0.00743, -0.02219], [0.86667, 0.0086, -0.02247], [0.92, 0.00934, -0.0227], [0.97333, 0.00956, -0.02293], [1.02667, 0.00918, -0.02316], [1.08, 0.00864, -0.02335], [1.13333, 0.00798, -0.02353], [1.18667, 0.00742, -0.02372], [1.24, 0.00707, -0.0239], [1.29333, 0.00684, -0.0241], [1.34667, 0.0068, -0.0243], [1.4, 0.0069, -0.02449], [1.45333, 0.0074, -0.02467], [1.50667, 0.00816, -0.02484], [1.56, 0.00898, -0.02501], [1.61333, 0.00976, -0.02518], [1.66667, 0.01042, -0.02537], [1.72, 0.01095, -0.02556]], "radius": 0.00042, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + mesh_hamon_back_1_5.userData.explodeWithParent = "blade"; + node_hamon_back_1_5.add(mesh_hamon_back_1_5); + meshes["hamon-back-1"] = mesh_hamon_back_1_5; + colliders["hamon-back-1"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_back_1_5); + + const attachment_hamon_back_2_6 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_back_2_6 = makeAttachmentEndpoint(attachment_hamon_back_2_6); + const node_hamon_back_2_6 = new THREE.Group(); + node_hamon_back_2_6.name = "Hamon back line 2__pivot"; + node_hamon_back_2_6.scale.set(1, 1, 1); + if (endpoint_hamon_back_2_6) { + node_hamon_back_2_6.position.copy(endpoint_hamon_back_2_6.start); + node_hamon_back_2_6.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_back_2_6.position.set(0.0, 0.0, 0.0); + node_hamon_back_2_6.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_back_2_6.userData.sculptComponent = {"id": "hamon-back-2", "name": "Hamon back line 2", "level": "micro", "role": "detail", "importance": 0.78, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.01579, -0.01291], [0.33333, 0.0156, -0.01444], [0.38667, 0.01513, -0.01576], [0.44, 0.01488, -0.01709], [0.49333, 0.01474, -0.0182], [0.54667, 0.01406, -0.01908], [0.6, 0.01426, -0.01996], [0.65333, 0.01435, -0.02075], [0.70667, 0.0145, -0.02141], [0.76, 0.01537, -0.02191], [0.81333, 0.01698, -0.02219], [0.86667, 0.0187, -0.02247], [0.92, 0.01956, -0.0227], [0.97333, 0.01924, -0.02293], [1.02667, 0.01765, -0.02316], [1.08, 0.01553, -0.02335], [1.13333, 0.01338, -0.02353], [1.18667, 0.01182, -0.02372], [1.24, 0.01117, -0.0239], [1.29333, 0.01126, -0.0241], [1.34667, 0.0119, -0.0243], [1.4, 0.01277, -0.02449], [1.45333, 0.01395, -0.02467], [1.50667, 0.01522, -0.02484], [1.56, 0.01639, -0.02501], [1.61333, 0.01734, -0.02518], [1.66667, 0.01804, -0.02537], [1.72, 0.01855, -0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}, "material": "hamon-steel", "materialLayers": ["hamon-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(184, 191, 198, 1.0)", "secondaryAlbedo": "rgba(154, 162, 169, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.72}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + node_hamon_back_2_6.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}; + node_hamon_back_2_6.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_back_2_6); + nodes["hamon-back-2"] = node_hamon_back_2_6; + const mesh_hamon_back_2_6Geometry = endpoint_hamon_back_2_6 + ? new THREE.CylinderGeometry(endpoint_hamon_back_2_6.endRadius, endpoint_hamon_back_2_6.baseRadius, endpoint_hamon_back_2_6.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.01579, -0.01291], [0.33333, 0.0156, -0.01444], [0.38667, 0.01513, -0.01576], [0.44, 0.01488, -0.01709], [0.49333, 0.01474, -0.0182], [0.54667, 0.01406, -0.01908], [0.6, 0.01426, -0.01996], [0.65333, 0.01435, -0.02075], [0.70667, 0.0145, -0.02141], [0.76, 0.01537, -0.02191], [0.81333, 0.01698, -0.02219], [0.86667, 0.0187, -0.02247], [0.92, 0.01956, -0.0227], [0.97333, 0.01924, -0.02293], [1.02667, 0.01765, -0.02316], [1.08, 0.01553, -0.02335], [1.13333, 0.01338, -0.02353], [1.18667, 0.01182, -0.02372], [1.24, 0.01117, -0.0239], [1.29333, 0.01126, -0.0241], [1.34667, 0.0119, -0.0243], [1.4, 0.01277, -0.02449], [1.45333, 0.01395, -0.02467], [1.50667, 0.01522, -0.02484], [1.56, 0.01639, -0.02501], [1.61333, 0.01734, -0.02518], [1.66667, 0.01804, -0.02537], [1.72, 0.01855, -0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_back_2_6) { + mesh_hamon_back_2_6Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_back_2_6 = new THREE.Mesh( + mesh_hamon_back_2_6Geometry, + materialMap["hamon-steel"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_back_2_6.name = "Hamon back line 2"; + if (endpoint_hamon_back_2_6) { + mesh_hamon_back_2_6.position.copy(endpoint_hamon_back_2_6.midpoint); + mesh_hamon_back_2_6.quaternion.copy(endpoint_hamon_back_2_6.quaternion); + } + mesh_hamon_back_2_6.castShadow = options.castShadow ?? true; + mesh_hamon_back_2_6.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_back_2_6.userData.sculptComponent = {"id": "hamon-back-2", "name": "Hamon back line 2", "level": "micro", "role": "detail", "importance": 0.78, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.01579, -0.01291], [0.33333, 0.0156, -0.01444], [0.38667, 0.01513, -0.01576], [0.44, 0.01488, -0.01709], [0.49333, 0.01474, -0.0182], [0.54667, 0.01406, -0.01908], [0.6, 0.01426, -0.01996], [0.65333, 0.01435, -0.02075], [0.70667, 0.0145, -0.02141], [0.76, 0.01537, -0.02191], [0.81333, 0.01698, -0.02219], [0.86667, 0.0187, -0.02247], [0.92, 0.01956, -0.0227], [0.97333, 0.01924, -0.02293], [1.02667, 0.01765, -0.02316], [1.08, 0.01553, -0.02335], [1.13333, 0.01338, -0.02353], [1.18667, 0.01182, -0.02372], [1.24, 0.01117, -0.0239], [1.29333, 0.01126, -0.0241], [1.34667, 0.0119, -0.0243], [1.4, 0.01277, -0.02449], [1.45333, 0.01395, -0.02467], [1.50667, 0.01522, -0.02484], [1.56, 0.01639, -0.02501], [1.61333, 0.01734, -0.02518], [1.66667, 0.01804, -0.02537], [1.72, 0.01855, -0.02556]], "radius": 0.00092, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel"}}, "material": "hamon-steel", "materialLayers": ["hamon-steel"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(184, 191, 198, 1.0)", "secondaryAlbedo": "rgba(154, 162, 169, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.72}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + mesh_hamon_back_2_6.userData.explodeWithParent = "blade"; + node_hamon_back_2_6.add(mesh_hamon_back_2_6); + meshes["hamon-back-2"] = mesh_hamon_back_2_6; + colliders["hamon-back-2"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_back_2_6); + + const attachment_hamon_back_3_7 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_hamon_back_3_7 = makeAttachmentEndpoint(attachment_hamon_back_3_7); + const node_hamon_back_3_7 = new THREE.Group(); + node_hamon_back_3_7.name = "Hamon back line 3__pivot"; + node_hamon_back_3_7.scale.set(1, 1, 1); + if (endpoint_hamon_back_3_7) { + node_hamon_back_3_7.position.copy(endpoint_hamon_back_3_7.start); + node_hamon_back_3_7.rotation.set(0.0, 0.0, 0.0); + } else { + node_hamon_back_3_7.position.set(0.0, 0.0, 0.0); + node_hamon_back_3_7.rotation.set(0.0, 0.0, 0.0); + } + node_hamon_back_3_7.userData.sculptComponent = {"id": "hamon-back-3", "name": "Hamon back line 3", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.02459, -0.01291], [0.33333, 0.02438, -0.01444], [0.38667, 0.02391, -0.01576], [0.44, 0.02375, -0.01709], [0.49333, 0.0238, -0.0182], [0.54667, 0.02342, -0.01908], [0.6, 0.02396, -0.01996], [0.65333, 0.02426, -0.02075], [0.70667, 0.0242, -0.02141], [0.76, 0.02426, -0.02191], [0.81333, 0.0245, -0.02219], [0.86667, 0.02464, -0.02247], [0.92, 0.02424, -0.0227], [0.97333, 0.02347, -0.02293], [1.02667, 0.02241, -0.02316], [1.08, 0.0216, -0.02335], [1.13333, 0.02108, -0.02353], [1.18667, 0.02103, -0.02372], [1.24, 0.02147, -0.0239], [1.29333, 0.02221, -0.0241], [1.34667, 0.02307, -0.0243], [1.4, 0.02384, -0.02449], [1.45333, 0.02465, -0.02467], [1.50667, 0.02536, -0.02484], [1.56, 0.02593, -0.02501], [1.61333, 0.02642, -0.02518], [1.66667, 0.02688, -0.02537], [1.72, 0.02735, -0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + node_hamon_back_3_7.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}; + node_hamon_back_3_7.userData.explodeWithParent = "blade"; + (nodes["root"] ?? root).add(node_hamon_back_3_7); + nodes["hamon-back-3"] = node_hamon_back_3_7; + const mesh_hamon_back_3_7Geometry = endpoint_hamon_back_3_7 + ? new THREE.CylinderGeometry(endpoint_hamon_back_3_7.endRadius, endpoint_hamon_back_3_7.baseRadius, endpoint_hamon_back_3_7.length, 32, 12) + : buildTubeGeometry({"points": [[0.28, 0.02459, -0.01291], [0.33333, 0.02438, -0.01444], [0.38667, 0.02391, -0.01576], [0.44, 0.02375, -0.01709], [0.49333, 0.0238, -0.0182], [0.54667, 0.02342, -0.01908], [0.6, 0.02396, -0.01996], [0.65333, 0.02426, -0.02075], [0.70667, 0.0242, -0.02141], [0.76, 0.02426, -0.02191], [0.81333, 0.0245, -0.02219], [0.86667, 0.02464, -0.02247], [0.92, 0.02424, -0.0227], [0.97333, 0.02347, -0.02293], [1.02667, 0.02241, -0.02316], [1.08, 0.0216, -0.02335], [1.13333, 0.02108, -0.02353], [1.18667, 0.02103, -0.02372], [1.24, 0.02147, -0.0239], [1.29333, 0.02221, -0.0241], [1.34667, 0.02307, -0.0243], [1.4, 0.02384, -0.02449], [1.45333, 0.02465, -0.02467], [1.50667, 0.02536, -0.02484], [1.56, 0.02593, -0.02501], [1.61333, 0.02642, -0.02518], [1.66667, 0.02688, -0.02537], [1.72, 0.02735, -0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}); + if (!endpoint_hamon_back_3_7) { + mesh_hamon_back_3_7Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_hamon_back_3_7 = new THREE.Mesh( + mesh_hamon_back_3_7Geometry, + materialMap["hamon-steel-secondary"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_hamon_back_3_7.name = "Hamon back line 3"; + if (endpoint_hamon_back_3_7) { + mesh_hamon_back_3_7.position.copy(endpoint_hamon_back_3_7.midpoint); + mesh_hamon_back_3_7.quaternion.copy(endpoint_hamon_back_3_7.quaternion); + } + mesh_hamon_back_3_7.castShadow = options.castShadow ?? true; + mesh_hamon_back_3_7.receiveShadow = options.receiveShadow ?? true; + mesh_hamon_back_3_7.userData.sculptComponent = {"id": "hamon-back-3", "name": "Hamon back line 3", "level": "micro", "role": "detail", "importance": 0.58, "confidence": 0.68, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Primary hamon plus quieter companion etches on the back face; low-frequency wander with tapered ends, not three equal highlight rails.", "geometryDescriptor": {"topologyIntent": "Hamon back line 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[0.28, 0.02459, -0.01291], [0.33333, 0.02438, -0.01444], [0.38667, 0.02391, -0.01576], [0.44, 0.02375, -0.01709], [0.49333, 0.0238, -0.0182], [0.54667, 0.02342, -0.01908], [0.6, 0.02396, -0.01996], [0.65333, 0.02426, -0.02075], [0.70667, 0.0242, -0.02141], [0.76, 0.02426, -0.02191], [0.81333, 0.0245, -0.02219], [0.86667, 0.02464, -0.02247], [0.92, 0.02424, -0.0227], [0.97333, 0.02347, -0.02293], [1.02667, 0.02241, -0.02316], [1.08, 0.0216, -0.02335], [1.13333, 0.02108, -0.02353], [1.18667, 0.02103, -0.02372], [1.24, 0.02147, -0.0239], [1.29333, 0.02221, -0.0241], [1.34667, 0.02307, -0.0243], [1.4, 0.02384, -0.02449], [1.45333, 0.02465, -0.02467], [1.50667, 0.02536, -0.02484], [1.56, 0.02593, -0.02501], [1.61333, 0.02642, -0.02518], [1.66667, 0.02688, -0.02537], [1.72, 0.02735, -0.02556]], "radius": 0.00036, "radialSegments": 5, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.68}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "blade", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "hamon-steel-secondary"}}, "material": "hamon-steel-secondary", "materialLayers": ["hamon-steel-secondary"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["blade-face"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(142, 149, 156, 1.0)", "secondaryAlbedo": "rgba(122, 129, 136, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.6}, "explodeWithParent": "blade", "ownerModule": "blade", "face": "back", "mergePolicy": "bake"}; + mesh_hamon_back_3_7.userData.explodeWithParent = "blade"; + node_hamon_back_3_7.add(mesh_hamon_back_3_7); + meshes["hamon-back-3"] = mesh_hamon_back_3_7; + colliders["hamon-back-3"] = null; + destructionGroups["blade"] ??= []; + destructionGroups["blade"].push(node_hamon_back_3_7); + + const attachment_guard_8 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_guard_8 = makeAttachmentEndpoint(attachment_guard_8); + const node_guard_8 = new THREE.Group(); + node_guard_8.name = "Disk guard__pivot"; + node_guard_8.scale.set(1, 1, 1); + if (endpoint_guard_8) { + node_guard_8.position.copy(endpoint_guard_8.start); + node_guard_8.rotation.set(0.0, 0.0, 1.5707963267948966); + } else { + node_guard_8.position.set(1.814504716981132, 0.0, 0.0); + node_guard_8.rotation.set(0.0, 0.0, 1.5707963267948966); + } + node_guard_8.userData.sculptComponent = {"id": "guard", "name": "Disk guard", "level": "meso", "role": "body", "importance": 0.95, "confidence": 0.86, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Disk axis along the blade. Face-on it is a thin gilt edge; from the tip or a 3/4 it reads as a circle.", "geometryDescriptor": {"topologyIntent": "Disk guard reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.11933962264150942, "height": 0.004068396226415094, "depth": 0.11933962264150942, "units": "relative", "confidence": 0.86}, "transform": {"position": [1.814504716981132, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.11933962264150942, 0.004068396226415094, 0.11933962264150942]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "disk guard proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "guard", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "disk-guard", "kind": "contour", "notes": "Circle in side/top; thin gilt line in the face view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["side-guard", "full-object"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.8}}; + node_guard_8.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "disk guard proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "guard", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_guard_8.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_guard_8); + nodes["guard"] = node_guard_8; + const mesh_guard_8Geometry = endpoint_guard_8 + ? new THREE.CylinderGeometry(endpoint_guard_8.endRadius, endpoint_guard_8.baseRadius, endpoint_guard_8.length, 32, 12) + : new THREE.CylinderGeometry(0.5, 0.5, 1, 48, 16); + if (!endpoint_guard_8) { + mesh_guard_8Geometry.scale(0.11933962264150942, 0.004068396226415094, 0.11933962264150942); + } + const mesh_guard_8 = new THREE.Mesh( + mesh_guard_8Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_guard_8.name = "Disk guard"; + if (endpoint_guard_8) { + mesh_guard_8.position.copy(endpoint_guard_8.midpoint); + mesh_guard_8.quaternion.copy(endpoint_guard_8.quaternion); + } + mesh_guard_8.castShadow = options.castShadow ?? true; + mesh_guard_8.receiveShadow = options.receiveShadow ?? true; + mesh_guard_8.userData.sculptComponent = {"id": "guard", "name": "Disk guard", "level": "meso", "role": "body", "importance": 0.95, "confidence": 0.86, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Disk axis along the blade. Face-on it is a thin gilt edge; from the tip or a 3/4 it reads as a circle.", "geometryDescriptor": {"topologyIntent": "Disk guard reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.11933962264150942, "height": 0.004068396226415094, "depth": 0.11933962264150942, "units": "relative", "confidence": 0.86}, "transform": {"position": [1.814504716981132, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.11933962264150942, 0.004068396226415094, 0.11933962264150942]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "disk guard proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "guard", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "disk-guard", "kind": "contour", "notes": "Circle in side/top; thin gilt line in the face view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["side-guard", "full-object"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.8}}; + mesh_guard_8.userData.explodeWithParent = null; + node_guard_8.add(mesh_guard_8); + meshes["guard"] = mesh_guard_8; + colliders["guard"] = {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "disk guard proxy"}; + destructionGroups["guard"] ??= []; + destructionGroups["guard"].push(node_guard_8); + + const attachment_collar_9 = {"parentId": "root", "parentSocket": "guard-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_collar_9 = makeAttachmentEndpoint(attachment_collar_9); + const node_collar_9 = new THREE.Group(); + node_collar_9.name = "Gilt front ferrule__pivot"; + node_collar_9.scale.set(1, 1, 1); + if (endpoint_collar_9) { + node_collar_9.position.copy(endpoint_collar_9.start); + node_collar_9.rotation.set(0.0, 0.0, 1.5707963267948966); + } else { + node_collar_9.position.set(1.8200318396226414, 0.0, 0.0); + node_collar_9.rotation.set(0.0, 0.0, 1.5707963267948966); + } + node_collar_9.userData.sculptComponent = {"id": "collar", "name": "Gilt front ferrule", "level": "meso", "role": "body", "importance": 0.8, "confidence": 0.8, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Short gilt sleeve between the disk and the wrap. Thinner than the wrap so it reads as a band, not a cap.", "geometryDescriptor": {"topologyIntent": "Gilt front ferrule reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "guard-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.07865566037735848, "height": 0.018985849056603773, "depth": 0.07865566037735848, "units": "relative", "confidence": 0.8}, "transform": {"position": [1.8200318396226414, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.07865566037735848, 0.018985849056603773, 0.07865566037735848]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "front ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "collar", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "front-ferrule", "kind": "seam", "notes": "Visually distinct from wrap and steel."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["full-object", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}}; + node_collar_9.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "front ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "collar", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_collar_9.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_collar_9); + nodes["collar"] = node_collar_9; + const mesh_collar_9Geometry = endpoint_collar_9 + ? new THREE.CylinderGeometry(endpoint_collar_9.endRadius, endpoint_collar_9.baseRadius, endpoint_collar_9.length, 32, 12) + : new THREE.CylinderGeometry(0.5, 0.5, 1, 48, 16); + if (!endpoint_collar_9) { + mesh_collar_9Geometry.scale(0.07865566037735848, 0.018985849056603773, 0.07865566037735848); + } + const mesh_collar_9 = new THREE.Mesh( + mesh_collar_9Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_collar_9.name = "Gilt front ferrule"; + if (endpoint_collar_9) { + mesh_collar_9.position.copy(endpoint_collar_9.midpoint); + mesh_collar_9.quaternion.copy(endpoint_collar_9.quaternion); + } + mesh_collar_9.castShadow = options.castShadow ?? true; + mesh_collar_9.receiveShadow = options.receiveShadow ?? true; + mesh_collar_9.userData.sculptComponent = {"id": "collar", "name": "Gilt front ferrule", "level": "meso", "role": "body", "importance": 0.8, "confidence": 0.8, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Short gilt sleeve between the disk and the wrap. Thinner than the wrap so it reads as a band, not a cap.", "geometryDescriptor": {"topologyIntent": "Gilt front ferrule reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "guard-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.012, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.07865566037735848, "height": 0.018985849056603773, "depth": 0.07865566037735848, "units": "relative", "confidence": 0.8}, "transform": {"position": [1.8200318396226414, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.07865566037735848, 0.018985849056603773, 0.07865566037735848]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "front ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "collar", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "front-ferrule", "kind": "seam", "notes": "Visually distinct from wrap and steel."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["full-object", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}}; + mesh_collar_9.userData.explodeWithParent = null; + node_collar_9.add(mesh_collar_9); + meshes["collar"] = mesh_collar_9; + colliders["collar"] = {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "front ferrule proxy"}; + destructionGroups["collar"] ??= []; + destructionGroups["collar"].push(node_collar_9); + + const attachment_handle_10 = {"parentId": "root", "parentSocket": "front-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.02, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_handle_10 = makeAttachmentEndpoint(attachment_handle_10); + const node_handle_10 = new THREE.Group(); + node_handle_10.name = "Cord-wrapped grip__pivot"; + node_handle_10.scale.set(1, 1, 1); + if (endpoint_handle_10) { + node_handle_10.position.copy(endpoint_handle_10.start); + node_handle_10.rotation.set(0.0, 0.0, 1.5707963267948966); + } else { + node_handle_10.position.set(1.9653089622641509, 0.0, 0.0); + node_handle_10.rotation.set(0.0, 0.0, 1.5707963267948966); + } + node_handle_10.userData.sculptComponent = {"id": "handle", "name": "Cord-wrapped grip", "level": "macro", "role": "handle", "importance": 0.95, "confidence": 0.84, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Dark cylindrical wrap. Degenerate attachment keeps the authored cylinder.", "geometryDescriptor": {"topologyIntent": "Cord-wrapped grip reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "front-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.02, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.09086084905660377, "height": 0.29156839622641506, "depth": 0.09086084905660377, "units": "relative", "confidence": 0.84}, "transform": {"position": [1.9653089622641509, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.09086084905660377, 0.29156839622641506, 0.09086084905660377]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "grip proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "cord-wrap"}}, "material": "cord-wrap", "materialLayers": ["cord-wrap"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "wrapped-grip", "kind": "seam", "notes": "Two counter-wound helical seam tubes define the crossed wrap."}, {"id": "diamond-inlays", "kind": "fastener", "notes": "Six thin gilt lozenges per face sit nearly flush in paired dark seats."}], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(58, 36, 24, 1.0)", "secondaryAlbedo": "rgba(36, 22, 16, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}}; + node_handle_10.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "grip proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "cord-wrap"}}; + node_handle_10.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_handle_10); + nodes["handle"] = node_handle_10; + const mesh_handle_10Geometry = endpoint_handle_10 + ? new THREE.CylinderGeometry(endpoint_handle_10.endRadius, endpoint_handle_10.baseRadius, endpoint_handle_10.length, 32, 12) + : new THREE.CylinderGeometry(0.5, 0.5, 1, 48, 16); + if (!endpoint_handle_10) { + mesh_handle_10Geometry.scale(0.09086084905660377, 0.29156839622641506, 0.09086084905660377); + } + const mesh_handle_10 = new THREE.Mesh( + mesh_handle_10Geometry, + materialMap["cord-wrap"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_handle_10.name = "Cord-wrapped grip"; + if (endpoint_handle_10) { + mesh_handle_10.position.copy(endpoint_handle_10.midpoint); + mesh_handle_10.quaternion.copy(endpoint_handle_10.quaternion); + } + mesh_handle_10.castShadow = options.castShadow ?? true; + mesh_handle_10.receiveShadow = options.receiveShadow ?? true; + mesh_handle_10.userData.sculptComponent = {"id": "handle", "name": "Cord-wrapped grip", "level": "macro", "role": "handle", "importance": 0.95, "confidence": 0.84, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Dark cylindrical wrap. Degenerate attachment keeps the authored cylinder.", "geometryDescriptor": {"topologyIntent": "Cord-wrapped grip reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "front-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.02, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.09086084905660377, "height": 0.29156839622641506, "depth": 0.09086084905660377, "units": "relative", "confidence": 0.84}, "transform": {"position": [1.9653089622641509, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.09086084905660377, 0.29156839622641506, 0.09086084905660377]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "grip proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "cord-wrap"}}, "material": "cord-wrap", "materialLayers": ["cord-wrap"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "wrapped-grip", "kind": "seam", "notes": "Two counter-wound helical seam tubes define the crossed wrap."}, {"id": "diamond-inlays", "kind": "fastener", "notes": "Six thin gilt lozenges per face sit nearly flush in paired dark seats."}], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(58, 36, 24, 1.0)", "secondaryAlbedo": "rgba(36, 22, 16, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}}; + mesh_handle_10.userData.explodeWithParent = null; + node_handle_10.add(mesh_handle_10); + meshes["handle"] = mesh_handle_10; + colliders["handle"] = {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "grip proxy"}; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_handle_10); + + const attachment_wrap_seam_1_11 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_wrap_seam_1_11 = makeAttachmentEndpoint(attachment_wrap_seam_1_11); + const node_wrap_seam_1_11 = new THREE.Group(); + node_wrap_seam_1_11.name = "Cord wrap seam 1__pivot"; + node_wrap_seam_1_11.scale.set(1, 1, 1); + if (endpoint_wrap_seam_1_11) { + node_wrap_seam_1_11.position.copy(endpoint_wrap_seam_1_11.start); + node_wrap_seam_1_11.rotation.set(0.0, 0.0, 0.0); + } else { + node_wrap_seam_1_11.position.set(0.0, 0.0, 0.0); + node_wrap_seam_1_11.rotation.set(0.0, 0.0, 0.0); + } + node_wrap_seam_1_11.userData.sculptComponent = {"id": "wrap-seam-1", "name": "Cord wrap seam 1", "level": "micro", "role": "detail", "importance": 0.7, "confidence": 0.8, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "A shallow helical valley makes the wrapped grip read in face and orbit views.", "geometryDescriptor": {"topologyIntent": "Cord wrap seam 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[1.82552, 0.01536, 0.04208], [1.82844, 0.0239, 0.03789], [1.83135, 0.03136, 0.03199], [1.83426, 0.0374, 0.02465], [1.83717, 0.04176, 0.0162], [1.84009, 0.04424, 0.00701], [1.843, 0.04473, -0.00248], [1.84591, 0.04319, -0.01187], [1.84882, 0.03971, -0.02072], [1.85173, 0.03444, -0.02864], [1.85465, 0.02762, -0.03526], [1.85756, 0.01956, -0.0403], [1.86047, 0.01061, -0.04352], [1.86338, 0.00118, -0.04478], [1.8663, -0.0083, -0.04402], [1.86921, -0.01741, -0.04127], [1.87212, -0.02573, -0.03667], [1.87503, -0.03289, -0.03041], [1.87794, -0.03857, -0.02278], [1.88086, -0.04251, -0.01413], [1.88377, -0.04453, -0.00484], [1.88668, -0.04455, 0.00468], [1.88959, -0.04256, 0.01397], [1.8925, -0.03865, 0.02264], [1.89542, -0.033, 0.03029], [1.89833, -0.02586, 0.03658], [1.90124, -0.01755, 0.04121], [1.90415, -0.00846, 0.04399], [1.90707, 0.00102, 0.04478], [1.90998, 0.01045, 0.04356], [1.91289, 0.01941, 0.04037], [1.9158, 0.0275, 0.03536], [1.91871, 0.03434, 0.02876], [1.92163, 0.03964, 0.02086], [1.92454, 0.04315, 0.01202], [1.92745, 0.04472, 0.00264], [1.93036, 0.04427, -0.00686], [1.93328, 0.04182, -0.01605], [1.93619, 0.03749, -0.02451], [1.9391, 0.03147, -0.03188], [1.94201, 0.02403, -0.0378], [1.94492, 0.01551, -0.04202], [1.94784, 0.00629, -0.04435], [1.95075, -0.00322, -0.04468], [1.95366, -0.01257, -0.04299], [1.95657, -0.02137, -0.03937], [1.95948, -0.0292, -0.03397], [1.9624, -0.03571, -0.02704], [1.96531, -0.04062, -0.01889], [1.96822, -0.04369, -0.00989], [1.97113, -0.04479, -0.00045], [1.97405, -0.04388, 0.00902], [1.97696, -0.04098, 0.01808], [1.97987, -0.03624, 0.02632], [1.98278, -0.02987, 0.03338], [1.98569, -0.02215, 0.03894], [1.98861, -0.01343, 0.04273], [1.99152, -0.00411, 0.04461], [1.99443, 0.0054, 0.04447], [1.99734, 0.01467, 0.04232], [2.00026, 0.02327, 0.03827], [2.00317, 0.03083, 0.0325], [2.00608, 0.037, 0.02526], [2.00899, 0.04149, 0.01688], [2.0119, 0.04412, 0.00774], [2.01482, 0.04476, -0.00175], [2.01773, 0.04338, -0.01116], [2.02064, 0.04005, -0.02007], [2.02355, 0.03491, -0.02807], [2.02646, 0.0282, -0.03481], [2.02938, 0.02021, -0.03998], [2.03229, 0.01132, -0.04334], [2.0352, 0.00191, -0.04475], [2.03811, -0.00758, -0.04415], [2.04103, -0.01673, -0.04155], [2.04394, -0.02512, -0.03709], [2.04685, -0.03239, -0.03095], [2.04976, -0.03819, -0.02341], [2.05267, -0.04227, -0.01482], [2.05559, -0.04445, -0.00556], [2.0585, -0.04462, 0.00395], [2.06141, -0.04278, 0.01328], [2.06432, -0.03901, 0.02201], [2.06723, -0.03349, 0.02975], [2.07015, -0.02645, 0.03615], [2.07306, -0.01823, 0.04092], [2.07597, -0.00918, 0.04384], [2.07888, 0.00029, 0.04479], [2.0818, 0.00974, 0.04372], [2.08471, 0.01875, 0.04068], [2.08762, 0.02691, 0.03581], [2.09053, 0.03387, 0.02932], [2.09344, 0.03929, 0.02151], [2.09636, 0.04295, 0.01273], [2.09927, 0.04467, 0.00338], [2.10218, 0.04437, -0.00613], [2.10509, 0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.8}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(33, 20, 14, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "wrap", "mergePolicy": "bake"}; + node_wrap_seam_1_11.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_wrap_seam_1_11.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_wrap_seam_1_11); + nodes["wrap-seam-1"] = node_wrap_seam_1_11; + const mesh_wrap_seam_1_11Geometry = endpoint_wrap_seam_1_11 + ? new THREE.CylinderGeometry(endpoint_wrap_seam_1_11.endRadius, endpoint_wrap_seam_1_11.baseRadius, endpoint_wrap_seam_1_11.length, 32, 12) + : buildTubeGeometry({"points": [[1.82552, 0.01536, 0.04208], [1.82844, 0.0239, 0.03789], [1.83135, 0.03136, 0.03199], [1.83426, 0.0374, 0.02465], [1.83717, 0.04176, 0.0162], [1.84009, 0.04424, 0.00701], [1.843, 0.04473, -0.00248], [1.84591, 0.04319, -0.01187], [1.84882, 0.03971, -0.02072], [1.85173, 0.03444, -0.02864], [1.85465, 0.02762, -0.03526], [1.85756, 0.01956, -0.0403], [1.86047, 0.01061, -0.04352], [1.86338, 0.00118, -0.04478], [1.8663, -0.0083, -0.04402], [1.86921, -0.01741, -0.04127], [1.87212, -0.02573, -0.03667], [1.87503, -0.03289, -0.03041], [1.87794, -0.03857, -0.02278], [1.88086, -0.04251, -0.01413], [1.88377, -0.04453, -0.00484], [1.88668, -0.04455, 0.00468], [1.88959, -0.04256, 0.01397], [1.8925, -0.03865, 0.02264], [1.89542, -0.033, 0.03029], [1.89833, -0.02586, 0.03658], [1.90124, -0.01755, 0.04121], [1.90415, -0.00846, 0.04399], [1.90707, 0.00102, 0.04478], [1.90998, 0.01045, 0.04356], [1.91289, 0.01941, 0.04037], [1.9158, 0.0275, 0.03536], [1.91871, 0.03434, 0.02876], [1.92163, 0.03964, 0.02086], [1.92454, 0.04315, 0.01202], [1.92745, 0.04472, 0.00264], [1.93036, 0.04427, -0.00686], [1.93328, 0.04182, -0.01605], [1.93619, 0.03749, -0.02451], [1.9391, 0.03147, -0.03188], [1.94201, 0.02403, -0.0378], [1.94492, 0.01551, -0.04202], [1.94784, 0.00629, -0.04435], [1.95075, -0.00322, -0.04468], [1.95366, -0.01257, -0.04299], [1.95657, -0.02137, -0.03937], [1.95948, -0.0292, -0.03397], [1.9624, -0.03571, -0.02704], [1.96531, -0.04062, -0.01889], [1.96822, -0.04369, -0.00989], [1.97113, -0.04479, -0.00045], [1.97405, -0.04388, 0.00902], [1.97696, -0.04098, 0.01808], [1.97987, -0.03624, 0.02632], [1.98278, -0.02987, 0.03338], [1.98569, -0.02215, 0.03894], [1.98861, -0.01343, 0.04273], [1.99152, -0.00411, 0.04461], [1.99443, 0.0054, 0.04447], [1.99734, 0.01467, 0.04232], [2.00026, 0.02327, 0.03827], [2.00317, 0.03083, 0.0325], [2.00608, 0.037, 0.02526], [2.00899, 0.04149, 0.01688], [2.0119, 0.04412, 0.00774], [2.01482, 0.04476, -0.00175], [2.01773, 0.04338, -0.01116], [2.02064, 0.04005, -0.02007], [2.02355, 0.03491, -0.02807], [2.02646, 0.0282, -0.03481], [2.02938, 0.02021, -0.03998], [2.03229, 0.01132, -0.04334], [2.0352, 0.00191, -0.04475], [2.03811, -0.00758, -0.04415], [2.04103, -0.01673, -0.04155], [2.04394, -0.02512, -0.03709], [2.04685, -0.03239, -0.03095], [2.04976, -0.03819, -0.02341], [2.05267, -0.04227, -0.01482], [2.05559, -0.04445, -0.00556], [2.0585, -0.04462, 0.00395], [2.06141, -0.04278, 0.01328], [2.06432, -0.03901, 0.02201], [2.06723, -0.03349, 0.02975], [2.07015, -0.02645, 0.03615], [2.07306, -0.01823, 0.04092], [2.07597, -0.00918, 0.04384], [2.07888, 0.00029, 0.04479], [2.0818, 0.00974, 0.04372], [2.08471, 0.01875, 0.04068], [2.08762, 0.02691, 0.03581], [2.09053, 0.03387, 0.02932], [2.09344, 0.03929, 0.02151], [2.09636, 0.04295, 0.01273], [2.09927, 0.04467, 0.00338], [2.10218, 0.04437, -0.00613], [2.10509, 0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}); + if (!endpoint_wrap_seam_1_11) { + mesh_wrap_seam_1_11Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_wrap_seam_1_11 = new THREE.Mesh( + mesh_wrap_seam_1_11Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_wrap_seam_1_11.name = "Cord wrap seam 1"; + if (endpoint_wrap_seam_1_11) { + mesh_wrap_seam_1_11.position.copy(endpoint_wrap_seam_1_11.midpoint); + mesh_wrap_seam_1_11.quaternion.copy(endpoint_wrap_seam_1_11.quaternion); + } + mesh_wrap_seam_1_11.castShadow = options.castShadow ?? true; + mesh_wrap_seam_1_11.receiveShadow = options.receiveShadow ?? true; + mesh_wrap_seam_1_11.userData.sculptComponent = {"id": "wrap-seam-1", "name": "Cord wrap seam 1", "level": "micro", "role": "detail", "importance": 0.7, "confidence": 0.8, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "A shallow helical valley makes the wrapped grip read in face and orbit views.", "geometryDescriptor": {"topologyIntent": "Cord wrap seam 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[1.82552, 0.01536, 0.04208], [1.82844, 0.0239, 0.03789], [1.83135, 0.03136, 0.03199], [1.83426, 0.0374, 0.02465], [1.83717, 0.04176, 0.0162], [1.84009, 0.04424, 0.00701], [1.843, 0.04473, -0.00248], [1.84591, 0.04319, -0.01187], [1.84882, 0.03971, -0.02072], [1.85173, 0.03444, -0.02864], [1.85465, 0.02762, -0.03526], [1.85756, 0.01956, -0.0403], [1.86047, 0.01061, -0.04352], [1.86338, 0.00118, -0.04478], [1.8663, -0.0083, -0.04402], [1.86921, -0.01741, -0.04127], [1.87212, -0.02573, -0.03667], [1.87503, -0.03289, -0.03041], [1.87794, -0.03857, -0.02278], [1.88086, -0.04251, -0.01413], [1.88377, -0.04453, -0.00484], [1.88668, -0.04455, 0.00468], [1.88959, -0.04256, 0.01397], [1.8925, -0.03865, 0.02264], [1.89542, -0.033, 0.03029], [1.89833, -0.02586, 0.03658], [1.90124, -0.01755, 0.04121], [1.90415, -0.00846, 0.04399], [1.90707, 0.00102, 0.04478], [1.90998, 0.01045, 0.04356], [1.91289, 0.01941, 0.04037], [1.9158, 0.0275, 0.03536], [1.91871, 0.03434, 0.02876], [1.92163, 0.03964, 0.02086], [1.92454, 0.04315, 0.01202], [1.92745, 0.04472, 0.00264], [1.93036, 0.04427, -0.00686], [1.93328, 0.04182, -0.01605], [1.93619, 0.03749, -0.02451], [1.9391, 0.03147, -0.03188], [1.94201, 0.02403, -0.0378], [1.94492, 0.01551, -0.04202], [1.94784, 0.00629, -0.04435], [1.95075, -0.00322, -0.04468], [1.95366, -0.01257, -0.04299], [1.95657, -0.02137, -0.03937], [1.95948, -0.0292, -0.03397], [1.9624, -0.03571, -0.02704], [1.96531, -0.04062, -0.01889], [1.96822, -0.04369, -0.00989], [1.97113, -0.04479, -0.00045], [1.97405, -0.04388, 0.00902], [1.97696, -0.04098, 0.01808], [1.97987, -0.03624, 0.02632], [1.98278, -0.02987, 0.03338], [1.98569, -0.02215, 0.03894], [1.98861, -0.01343, 0.04273], [1.99152, -0.00411, 0.04461], [1.99443, 0.0054, 0.04447], [1.99734, 0.01467, 0.04232], [2.00026, 0.02327, 0.03827], [2.00317, 0.03083, 0.0325], [2.00608, 0.037, 0.02526], [2.00899, 0.04149, 0.01688], [2.0119, 0.04412, 0.00774], [2.01482, 0.04476, -0.00175], [2.01773, 0.04338, -0.01116], [2.02064, 0.04005, -0.02007], [2.02355, 0.03491, -0.02807], [2.02646, 0.0282, -0.03481], [2.02938, 0.02021, -0.03998], [2.03229, 0.01132, -0.04334], [2.0352, 0.00191, -0.04475], [2.03811, -0.00758, -0.04415], [2.04103, -0.01673, -0.04155], [2.04394, -0.02512, -0.03709], [2.04685, -0.03239, -0.03095], [2.04976, -0.03819, -0.02341], [2.05267, -0.04227, -0.01482], [2.05559, -0.04445, -0.00556], [2.0585, -0.04462, 0.00395], [2.06141, -0.04278, 0.01328], [2.06432, -0.03901, 0.02201], [2.06723, -0.03349, 0.02975], [2.07015, -0.02645, 0.03615], [2.07306, -0.01823, 0.04092], [2.07597, -0.00918, 0.04384], [2.07888, 0.00029, 0.04479], [2.0818, 0.00974, 0.04372], [2.08471, 0.01875, 0.04068], [2.08762, 0.02691, 0.03581], [2.09053, 0.03387, 0.02932], [2.09344, 0.03929, 0.02151], [2.09636, 0.04295, 0.01273], [2.09927, 0.04467, 0.00338], [2.10218, 0.04437, -0.00613], [2.10509, 0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.8}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(33, 20, 14, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "wrap", "mergePolicy": "bake"}; + mesh_wrap_seam_1_11.userData.explodeWithParent = "handle"; + node_wrap_seam_1_11.add(mesh_wrap_seam_1_11); + meshes["wrap-seam-1"] = mesh_wrap_seam_1_11; + colliders["wrap-seam-1"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_wrap_seam_1_11); + + const attachment_wrap_seam_2_12 = {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_wrap_seam_2_12 = makeAttachmentEndpoint(attachment_wrap_seam_2_12); + const node_wrap_seam_2_12 = new THREE.Group(); + node_wrap_seam_2_12.name = "Cord wrap seam 2__pivot"; + node_wrap_seam_2_12.scale.set(1, 1, 1); + if (endpoint_wrap_seam_2_12) { + node_wrap_seam_2_12.position.copy(endpoint_wrap_seam_2_12.start); + node_wrap_seam_2_12.rotation.set(0.0, 0.0, 0.0); + } else { + node_wrap_seam_2_12.position.set(0.0, 0.0, 0.0); + node_wrap_seam_2_12.rotation.set(0.0, 0.0, 0.0); + } + node_wrap_seam_2_12.userData.sculptComponent = {"id": "wrap-seam-2", "name": "Cord wrap seam 2", "level": "micro", "role": "detail", "importance": 0.7, "confidence": 0.8, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "A shallow helical valley makes the wrapped grip read in face and orbit views.", "geometryDescriptor": {"topologyIntent": "Cord wrap seam 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[1.82552, -0.01536, 0.04208], [1.82844, -0.0239, 0.03789], [1.83135, -0.03136, 0.03199], [1.83426, -0.0374, 0.02465], [1.83717, -0.04176, 0.0162], [1.84009, -0.04424, 0.00701], [1.843, -0.04473, -0.00248], [1.84591, -0.04319, -0.01187], [1.84882, -0.03971, -0.02072], [1.85173, -0.03444, -0.02864], [1.85465, -0.02762, -0.03526], [1.85756, -0.01956, -0.0403], [1.86047, -0.01061, -0.04352], [1.86338, -0.00118, -0.04478], [1.8663, 0.0083, -0.04402], [1.86921, 0.01741, -0.04127], [1.87212, 0.02573, -0.03667], [1.87503, 0.03289, -0.03041], [1.87794, 0.03857, -0.02278], [1.88086, 0.04251, -0.01413], [1.88377, 0.04453, -0.00484], [1.88668, 0.04455, 0.00468], [1.88959, 0.04256, 0.01397], [1.8925, 0.03865, 0.02264], [1.89542, 0.033, 0.03029], [1.89833, 0.02586, 0.03658], [1.90124, 0.01755, 0.04121], [1.90415, 0.00846, 0.04399], [1.90707, -0.00102, 0.04478], [1.90998, -0.01045, 0.04356], [1.91289, -0.01941, 0.04037], [1.9158, -0.0275, 0.03536], [1.91871, -0.03434, 0.02876], [1.92163, -0.03964, 0.02086], [1.92454, -0.04315, 0.01202], [1.92745, -0.04472, 0.00264], [1.93036, -0.04427, -0.00686], [1.93328, -0.04182, -0.01605], [1.93619, -0.03749, -0.02451], [1.9391, -0.03147, -0.03188], [1.94201, -0.02403, -0.0378], [1.94492, -0.01551, -0.04202], [1.94784, -0.00629, -0.04435], [1.95075, 0.00322, -0.04468], [1.95366, 0.01257, -0.04299], [1.95657, 0.02137, -0.03937], [1.95948, 0.0292, -0.03397], [1.9624, 0.03571, -0.02704], [1.96531, 0.04062, -0.01889], [1.96822, 0.04369, -0.00989], [1.97113, 0.04479, -0.00045], [1.97405, 0.04388, 0.00902], [1.97696, 0.04098, 0.01808], [1.97987, 0.03624, 0.02632], [1.98278, 0.02987, 0.03338], [1.98569, 0.02215, 0.03894], [1.98861, 0.01343, 0.04273], [1.99152, 0.00411, 0.04461], [1.99443, -0.0054, 0.04447], [1.99734, -0.01467, 0.04232], [2.00026, -0.02327, 0.03827], [2.00317, -0.03083, 0.0325], [2.00608, -0.037, 0.02526], [2.00899, -0.04149, 0.01688], [2.0119, -0.04412, 0.00774], [2.01482, -0.04476, -0.00175], [2.01773, -0.04338, -0.01116], [2.02064, -0.04005, -0.02007], [2.02355, -0.03491, -0.02807], [2.02646, -0.0282, -0.03481], [2.02938, -0.02021, -0.03998], [2.03229, -0.01132, -0.04334], [2.0352, -0.00191, -0.04475], [2.03811, 0.00758, -0.04415], [2.04103, 0.01673, -0.04155], [2.04394, 0.02512, -0.03709], [2.04685, 0.03239, -0.03095], [2.04976, 0.03819, -0.02341], [2.05267, 0.04227, -0.01482], [2.05559, 0.04445, -0.00556], [2.0585, 0.04462, 0.00395], [2.06141, 0.04278, 0.01328], [2.06432, 0.03901, 0.02201], [2.06723, 0.03349, 0.02975], [2.07015, 0.02645, 0.03615], [2.07306, 0.01823, 0.04092], [2.07597, 0.00918, 0.04384], [2.07888, -0.00029, 0.04479], [2.0818, -0.00974, 0.04372], [2.08471, -0.01875, 0.04068], [2.08762, -0.02691, 0.03581], [2.09053, -0.03387, 0.02932], [2.09344, -0.03929, 0.02151], [2.09636, -0.04295, 0.01273], [2.09927, -0.04467, 0.00338], [2.10218, -0.04437, -0.00613], [2.10509, -0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.8}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(33, 20, 14, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "wrap", "mergePolicy": "bake"}; + node_wrap_seam_2_12.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_wrap_seam_2_12.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_wrap_seam_2_12); + nodes["wrap-seam-2"] = node_wrap_seam_2_12; + const mesh_wrap_seam_2_12Geometry = endpoint_wrap_seam_2_12 + ? new THREE.CylinderGeometry(endpoint_wrap_seam_2_12.endRadius, endpoint_wrap_seam_2_12.baseRadius, endpoint_wrap_seam_2_12.length, 32, 12) + : buildTubeGeometry({"points": [[1.82552, -0.01536, 0.04208], [1.82844, -0.0239, 0.03789], [1.83135, -0.03136, 0.03199], [1.83426, -0.0374, 0.02465], [1.83717, -0.04176, 0.0162], [1.84009, -0.04424, 0.00701], [1.843, -0.04473, -0.00248], [1.84591, -0.04319, -0.01187], [1.84882, -0.03971, -0.02072], [1.85173, -0.03444, -0.02864], [1.85465, -0.02762, -0.03526], [1.85756, -0.01956, -0.0403], [1.86047, -0.01061, -0.04352], [1.86338, -0.00118, -0.04478], [1.8663, 0.0083, -0.04402], [1.86921, 0.01741, -0.04127], [1.87212, 0.02573, -0.03667], [1.87503, 0.03289, -0.03041], [1.87794, 0.03857, -0.02278], [1.88086, 0.04251, -0.01413], [1.88377, 0.04453, -0.00484], [1.88668, 0.04455, 0.00468], [1.88959, 0.04256, 0.01397], [1.8925, 0.03865, 0.02264], [1.89542, 0.033, 0.03029], [1.89833, 0.02586, 0.03658], [1.90124, 0.01755, 0.04121], [1.90415, 0.00846, 0.04399], [1.90707, -0.00102, 0.04478], [1.90998, -0.01045, 0.04356], [1.91289, -0.01941, 0.04037], [1.9158, -0.0275, 0.03536], [1.91871, -0.03434, 0.02876], [1.92163, -0.03964, 0.02086], [1.92454, -0.04315, 0.01202], [1.92745, -0.04472, 0.00264], [1.93036, -0.04427, -0.00686], [1.93328, -0.04182, -0.01605], [1.93619, -0.03749, -0.02451], [1.9391, -0.03147, -0.03188], [1.94201, -0.02403, -0.0378], [1.94492, -0.01551, -0.04202], [1.94784, -0.00629, -0.04435], [1.95075, 0.00322, -0.04468], [1.95366, 0.01257, -0.04299], [1.95657, 0.02137, -0.03937], [1.95948, 0.0292, -0.03397], [1.9624, 0.03571, -0.02704], [1.96531, 0.04062, -0.01889], [1.96822, 0.04369, -0.00989], [1.97113, 0.04479, -0.00045], [1.97405, 0.04388, 0.00902], [1.97696, 0.04098, 0.01808], [1.97987, 0.03624, 0.02632], [1.98278, 0.02987, 0.03338], [1.98569, 0.02215, 0.03894], [1.98861, 0.01343, 0.04273], [1.99152, 0.00411, 0.04461], [1.99443, -0.0054, 0.04447], [1.99734, -0.01467, 0.04232], [2.00026, -0.02327, 0.03827], [2.00317, -0.03083, 0.0325], [2.00608, -0.037, 0.02526], [2.00899, -0.04149, 0.01688], [2.0119, -0.04412, 0.00774], [2.01482, -0.04476, -0.00175], [2.01773, -0.04338, -0.01116], [2.02064, -0.04005, -0.02007], [2.02355, -0.03491, -0.02807], [2.02646, -0.0282, -0.03481], [2.02938, -0.02021, -0.03998], [2.03229, -0.01132, -0.04334], [2.0352, -0.00191, -0.04475], [2.03811, 0.00758, -0.04415], [2.04103, 0.01673, -0.04155], [2.04394, 0.02512, -0.03709], [2.04685, 0.03239, -0.03095], [2.04976, 0.03819, -0.02341], [2.05267, 0.04227, -0.01482], [2.05559, 0.04445, -0.00556], [2.0585, 0.04462, 0.00395], [2.06141, 0.04278, 0.01328], [2.06432, 0.03901, 0.02201], [2.06723, 0.03349, 0.02975], [2.07015, 0.02645, 0.03615], [2.07306, 0.01823, 0.04092], [2.07597, 0.00918, 0.04384], [2.07888, -0.00029, 0.04479], [2.0818, -0.00974, 0.04372], [2.08471, -0.01875, 0.04068], [2.08762, -0.02691, 0.03581], [2.09053, -0.03387, 0.02932], [2.09344, -0.03929, 0.02151], [2.09636, -0.04295, 0.01273], [2.09927, -0.04467, 0.00338], [2.10218, -0.04437, -0.00613], [2.10509, -0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}); + if (!endpoint_wrap_seam_2_12) { + mesh_wrap_seam_2_12Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_wrap_seam_2_12 = new THREE.Mesh( + mesh_wrap_seam_2_12Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_wrap_seam_2_12.name = "Cord wrap seam 2"; + if (endpoint_wrap_seam_2_12) { + mesh_wrap_seam_2_12.position.copy(endpoint_wrap_seam_2_12.midpoint); + mesh_wrap_seam_2_12.quaternion.copy(endpoint_wrap_seam_2_12.quaternion); + } + mesh_wrap_seam_2_12.castShadow = options.castShadow ?? true; + mesh_wrap_seam_2_12.receiveShadow = options.receiveShadow ?? true; + mesh_wrap_seam_2_12.userData.sculptComponent = {"id": "wrap-seam-2", "name": "Cord wrap seam 2", "level": "micro", "role": "detail", "importance": 0.7, "confidence": 0.8, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "A shallow helical valley makes the wrapped grip read in face and orbit views.", "geometryDescriptor": {"topologyIntent": "Cord wrap seam 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[1.82552, -0.01536, 0.04208], [1.82844, -0.0239, 0.03789], [1.83135, -0.03136, 0.03199], [1.83426, -0.0374, 0.02465], [1.83717, -0.04176, 0.0162], [1.84009, -0.04424, 0.00701], [1.843, -0.04473, -0.00248], [1.84591, -0.04319, -0.01187], [1.84882, -0.03971, -0.02072], [1.85173, -0.03444, -0.02864], [1.85465, -0.02762, -0.03526], [1.85756, -0.01956, -0.0403], [1.86047, -0.01061, -0.04352], [1.86338, -0.00118, -0.04478], [1.8663, 0.0083, -0.04402], [1.86921, 0.01741, -0.04127], [1.87212, 0.02573, -0.03667], [1.87503, 0.03289, -0.03041], [1.87794, 0.03857, -0.02278], [1.88086, 0.04251, -0.01413], [1.88377, 0.04453, -0.00484], [1.88668, 0.04455, 0.00468], [1.88959, 0.04256, 0.01397], [1.8925, 0.03865, 0.02264], [1.89542, 0.033, 0.03029], [1.89833, 0.02586, 0.03658], [1.90124, 0.01755, 0.04121], [1.90415, 0.00846, 0.04399], [1.90707, -0.00102, 0.04478], [1.90998, -0.01045, 0.04356], [1.91289, -0.01941, 0.04037], [1.9158, -0.0275, 0.03536], [1.91871, -0.03434, 0.02876], [1.92163, -0.03964, 0.02086], [1.92454, -0.04315, 0.01202], [1.92745, -0.04472, 0.00264], [1.93036, -0.04427, -0.00686], [1.93328, -0.04182, -0.01605], [1.93619, -0.03749, -0.02451], [1.9391, -0.03147, -0.03188], [1.94201, -0.02403, -0.0378], [1.94492, -0.01551, -0.04202], [1.94784, -0.00629, -0.04435], [1.95075, 0.00322, -0.04468], [1.95366, 0.01257, -0.04299], [1.95657, 0.02137, -0.03937], [1.95948, 0.0292, -0.03397], [1.9624, 0.03571, -0.02704], [1.96531, 0.04062, -0.01889], [1.96822, 0.04369, -0.00989], [1.97113, 0.04479, -0.00045], [1.97405, 0.04388, 0.00902], [1.97696, 0.04098, 0.01808], [1.97987, 0.03624, 0.02632], [1.98278, 0.02987, 0.03338], [1.98569, 0.02215, 0.03894], [1.98861, 0.01343, 0.04273], [1.99152, 0.00411, 0.04461], [1.99443, -0.0054, 0.04447], [1.99734, -0.01467, 0.04232], [2.00026, -0.02327, 0.03827], [2.00317, -0.03083, 0.0325], [2.00608, -0.037, 0.02526], [2.00899, -0.04149, 0.01688], [2.0119, -0.04412, 0.00774], [2.01482, -0.04476, -0.00175], [2.01773, -0.04338, -0.01116], [2.02064, -0.04005, -0.02007], [2.02355, -0.03491, -0.02807], [2.02646, -0.0282, -0.03481], [2.02938, -0.02021, -0.03998], [2.03229, -0.01132, -0.04334], [2.0352, -0.00191, -0.04475], [2.03811, 0.00758, -0.04415], [2.04103, 0.01673, -0.04155], [2.04394, 0.02512, -0.03709], [2.04685, 0.03239, -0.03095], [2.04976, 0.03819, -0.02341], [2.05267, 0.04227, -0.01482], [2.05559, 0.04445, -0.00556], [2.0585, 0.04462, 0.00395], [2.06141, 0.04278, 0.01328], [2.06432, 0.03901, 0.02201], [2.06723, 0.03349, 0.02975], [2.07015, 0.02645, 0.03615], [2.07306, 0.01823, 0.04092], [2.07597, 0.00918, 0.04384], [2.07888, -0.00029, 0.04479], [2.0818, -0.00974, 0.04372], [2.08471, -0.01875, 0.04068], [2.08762, -0.02691, 0.03581], [2.09053, -0.03387, 0.02932], [2.09344, -0.03929, 0.02151], [2.09636, -0.04295, 0.01273], [2.09927, -0.04467, 0.00338], [2.10218, -0.04437, -0.00613], [2.10509, -0.04208, -0.01536]], "radius": 0.00115, "radialSegments": 6, "closed": false}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "blade-heel", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.8}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(33, 20, 14, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.78}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "wrap", "mergePolicy": "bake"}; + mesh_wrap_seam_2_12.userData.explodeWithParent = "handle"; + node_wrap_seam_2_12.add(mesh_wrap_seam_2_12); + meshes["wrap-seam-2"] = mesh_wrap_seam_2_12; + colliders["wrap-seam-2"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_wrap_seam_2_12); + + const endpoint_stud_seat_a_13 = makeAttachmentEndpoint(null); + const node_stud_seat_a_13 = new THREE.Group(); + node_stud_seat_a_13.name = "Diamond inlay seat 1__pivot"; + node_stud_seat_a_13.scale.set(1, 1, 1); + if (endpoint_stud_seat_a_13) { + node_stud_seat_a_13.position.copy(endpoint_stud_seat_a_13.start); + node_stud_seat_a_13.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_a_13.position.set(1.8611773921832884, 0.0, 0.04558042452830188); + node_stud_seat_a_13.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_a_13.userData.sculptComponent = {"id": "stud-seat-a", "name": "Diamond inlay seat 1", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.8611773921832884, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_a_13.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_a_13.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_a_13); + nodes["stud-seat-a"] = node_stud_seat_a_13; + const mesh_stud_seat_a_13Geometry = endpoint_stud_seat_a_13 + ? new THREE.CylinderGeometry(endpoint_stud_seat_a_13.endRadius, endpoint_stud_seat_a_13.baseRadius, endpoint_stud_seat_a_13.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_a_13) { + mesh_stud_seat_a_13Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_a_13 = new THREE.Mesh( + mesh_stud_seat_a_13Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_a_13.name = "Diamond inlay seat 1"; + if (endpoint_stud_seat_a_13) { + mesh_stud_seat_a_13.position.copy(endpoint_stud_seat_a_13.midpoint); + mesh_stud_seat_a_13.quaternion.copy(endpoint_stud_seat_a_13.quaternion); + } + mesh_stud_seat_a_13.castShadow = options.castShadow ?? true; + mesh_stud_seat_a_13.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_a_13.userData.sculptComponent = {"id": "stud-seat-a", "name": "Diamond inlay seat 1", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.8611773921832884, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_a_13.userData.explodeWithParent = "handle"; + node_stud_seat_a_13.add(mesh_stud_seat_a_13); + meshes["stud-seat-a"] = mesh_stud_seat_a_13; + colliders["stud-seat-a"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_a_13); + + const endpoint_stud_seat_b_14 = makeAttachmentEndpoint(null); + const node_stud_seat_b_14 = new THREE.Group(); + node_stud_seat_b_14.name = "Diamond inlay seat 2__pivot"; + node_stud_seat_b_14.scale.set(1, 1, 1); + if (endpoint_stud_seat_b_14) { + node_stud_seat_b_14.position.copy(endpoint_stud_seat_b_14.start); + node_stud_seat_b_14.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_b_14.position.set(1.9028300202156334, 0.0, 0.04558042452830188); + node_stud_seat_b_14.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_b_14.userData.sculptComponent = {"id": "stud-seat-b", "name": "Diamond inlay seat 2", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9028300202156334, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_b_14.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_b_14.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_b_14); + nodes["stud-seat-b"] = node_stud_seat_b_14; + const mesh_stud_seat_b_14Geometry = endpoint_stud_seat_b_14 + ? new THREE.CylinderGeometry(endpoint_stud_seat_b_14.endRadius, endpoint_stud_seat_b_14.baseRadius, endpoint_stud_seat_b_14.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_b_14) { + mesh_stud_seat_b_14Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_b_14 = new THREE.Mesh( + mesh_stud_seat_b_14Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_b_14.name = "Diamond inlay seat 2"; + if (endpoint_stud_seat_b_14) { + mesh_stud_seat_b_14.position.copy(endpoint_stud_seat_b_14.midpoint); + mesh_stud_seat_b_14.quaternion.copy(endpoint_stud_seat_b_14.quaternion); + } + mesh_stud_seat_b_14.castShadow = options.castShadow ?? true; + mesh_stud_seat_b_14.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_b_14.userData.sculptComponent = {"id": "stud-seat-b", "name": "Diamond inlay seat 2", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9028300202156334, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_b_14.userData.explodeWithParent = "handle"; + node_stud_seat_b_14.add(mesh_stud_seat_b_14); + meshes["stud-seat-b"] = mesh_stud_seat_b_14; + colliders["stud-seat-b"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_b_14); + + const endpoint_stud_seat_c_15 = makeAttachmentEndpoint(null); + const node_stud_seat_c_15 = new THREE.Group(); + node_stud_seat_c_15.name = "Diamond inlay seat 3__pivot"; + node_stud_seat_c_15.scale.set(1, 1, 1); + if (endpoint_stud_seat_c_15) { + node_stud_seat_c_15.position.copy(endpoint_stud_seat_c_15.start); + node_stud_seat_c_15.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_c_15.position.set(1.9444826482479782, 0.0, 0.04558042452830188); + node_stud_seat_c_15.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_c_15.userData.sculptComponent = {"id": "stud-seat-c", "name": "Diamond inlay seat 3", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9444826482479782, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_c_15.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_c_15.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_c_15); + nodes["stud-seat-c"] = node_stud_seat_c_15; + const mesh_stud_seat_c_15Geometry = endpoint_stud_seat_c_15 + ? new THREE.CylinderGeometry(endpoint_stud_seat_c_15.endRadius, endpoint_stud_seat_c_15.baseRadius, endpoint_stud_seat_c_15.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_c_15) { + mesh_stud_seat_c_15Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_c_15 = new THREE.Mesh( + mesh_stud_seat_c_15Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_c_15.name = "Diamond inlay seat 3"; + if (endpoint_stud_seat_c_15) { + mesh_stud_seat_c_15.position.copy(endpoint_stud_seat_c_15.midpoint); + mesh_stud_seat_c_15.quaternion.copy(endpoint_stud_seat_c_15.quaternion); + } + mesh_stud_seat_c_15.castShadow = options.castShadow ?? true; + mesh_stud_seat_c_15.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_c_15.userData.sculptComponent = {"id": "stud-seat-c", "name": "Diamond inlay seat 3", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9444826482479782, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_c_15.userData.explodeWithParent = "handle"; + node_stud_seat_c_15.add(mesh_stud_seat_c_15); + meshes["stud-seat-c"] = mesh_stud_seat_c_15; + colliders["stud-seat-c"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_c_15); + + const endpoint_stud_seat_d_16 = makeAttachmentEndpoint(null); + const node_stud_seat_d_16 = new THREE.Group(); + node_stud_seat_d_16.name = "Diamond inlay seat 4__pivot"; + node_stud_seat_d_16.scale.set(1, 1, 1); + if (endpoint_stud_seat_d_16) { + node_stud_seat_d_16.position.copy(endpoint_stud_seat_d_16.start); + node_stud_seat_d_16.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_d_16.position.set(1.9861352762803233, 0.0, 0.04558042452830188); + node_stud_seat_d_16.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_d_16.userData.sculptComponent = {"id": "stud-seat-d", "name": "Diamond inlay seat 4", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9861352762803233, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_d_16.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_d_16.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_d_16); + nodes["stud-seat-d"] = node_stud_seat_d_16; + const mesh_stud_seat_d_16Geometry = endpoint_stud_seat_d_16 + ? new THREE.CylinderGeometry(endpoint_stud_seat_d_16.endRadius, endpoint_stud_seat_d_16.baseRadius, endpoint_stud_seat_d_16.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_d_16) { + mesh_stud_seat_d_16Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_d_16 = new THREE.Mesh( + mesh_stud_seat_d_16Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_d_16.name = "Diamond inlay seat 4"; + if (endpoint_stud_seat_d_16) { + mesh_stud_seat_d_16.position.copy(endpoint_stud_seat_d_16.midpoint); + mesh_stud_seat_d_16.quaternion.copy(endpoint_stud_seat_d_16.quaternion); + } + mesh_stud_seat_d_16.castShadow = options.castShadow ?? true; + mesh_stud_seat_d_16.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_d_16.userData.sculptComponent = {"id": "stud-seat-d", "name": "Diamond inlay seat 4", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9861352762803233, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_d_16.userData.explodeWithParent = "handle"; + node_stud_seat_d_16.add(mesh_stud_seat_d_16); + meshes["stud-seat-d"] = mesh_stud_seat_d_16; + colliders["stud-seat-d"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_d_16); + + const endpoint_stud_seat_e_17 = makeAttachmentEndpoint(null); + const node_stud_seat_e_17 = new THREE.Group(); + node_stud_seat_e_17.name = "Diamond inlay seat 5__pivot"; + node_stud_seat_e_17.scale.set(1, 1, 1); + if (endpoint_stud_seat_e_17) { + node_stud_seat_e_17.position.copy(endpoint_stud_seat_e_17.start); + node_stud_seat_e_17.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_e_17.position.set(2.0277879043126683, 0.0, 0.04558042452830188); + node_stud_seat_e_17.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_e_17.userData.sculptComponent = {"id": "stud-seat-e", "name": "Diamond inlay seat 5", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0277879043126683, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_e_17.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_e_17.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_e_17); + nodes["stud-seat-e"] = node_stud_seat_e_17; + const mesh_stud_seat_e_17Geometry = endpoint_stud_seat_e_17 + ? new THREE.CylinderGeometry(endpoint_stud_seat_e_17.endRadius, endpoint_stud_seat_e_17.baseRadius, endpoint_stud_seat_e_17.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_e_17) { + mesh_stud_seat_e_17Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_e_17 = new THREE.Mesh( + mesh_stud_seat_e_17Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_e_17.name = "Diamond inlay seat 5"; + if (endpoint_stud_seat_e_17) { + mesh_stud_seat_e_17.position.copy(endpoint_stud_seat_e_17.midpoint); + mesh_stud_seat_e_17.quaternion.copy(endpoint_stud_seat_e_17.quaternion); + } + mesh_stud_seat_e_17.castShadow = options.castShadow ?? true; + mesh_stud_seat_e_17.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_e_17.userData.sculptComponent = {"id": "stud-seat-e", "name": "Diamond inlay seat 5", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0277879043126683, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_e_17.userData.explodeWithParent = "handle"; + node_stud_seat_e_17.add(mesh_stud_seat_e_17); + meshes["stud-seat-e"] = mesh_stud_seat_e_17; + colliders["stud-seat-e"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_e_17); + + const endpoint_stud_seat_f_18 = makeAttachmentEndpoint(null); + const node_stud_seat_f_18 = new THREE.Group(); + node_stud_seat_f_18.name = "Diamond inlay seat 6__pivot"; + node_stud_seat_f_18.scale.set(1, 1, 1); + if (endpoint_stud_seat_f_18) { + node_stud_seat_f_18.position.copy(endpoint_stud_seat_f_18.start); + node_stud_seat_f_18.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_f_18.position.set(2.0694405323450136, 0.0, 0.04558042452830188); + node_stud_seat_f_18.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_f_18.userData.sculptComponent = {"id": "stud-seat-f", "name": "Diamond inlay seat 6", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0694405323450136, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + node_stud_seat_f_18.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_f_18.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_f_18); + nodes["stud-seat-f"] = node_stud_seat_f_18; + const mesh_stud_seat_f_18Geometry = endpoint_stud_seat_f_18 + ? new THREE.CylinderGeometry(endpoint_stud_seat_f_18.endRadius, endpoint_stud_seat_f_18.baseRadius, endpoint_stud_seat_f_18.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_f_18) { + mesh_stud_seat_f_18Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_f_18 = new THREE.Mesh( + mesh_stud_seat_f_18Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_f_18.name = "Diamond inlay seat 6"; + if (endpoint_stud_seat_f_18) { + mesh_stud_seat_f_18.position.copy(endpoint_stud_seat_f_18.midpoint); + mesh_stud_seat_f_18.quaternion.copy(endpoint_stud_seat_f_18.quaternion); + } + mesh_stud_seat_f_18.castShadow = options.castShadow ?? true; + mesh_stud_seat_f_18.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_f_18.userData.sculptComponent = {"id": "stud-seat-f", "name": "Diamond inlay seat 6", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the front gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond inlay seat 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0694405323450136, 0.0, 0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "bake"}; + mesh_stud_seat_f_18.userData.explodeWithParent = "handle"; + node_stud_seat_f_18.add(mesh_stud_seat_f_18); + meshes["stud-seat-f"] = mesh_stud_seat_f_18; + colliders["stud-seat-f"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_f_18); + + const endpoint_stud_seat_back_a_19 = makeAttachmentEndpoint(null); + const node_stud_seat_back_a_19 = new THREE.Group(); + node_stud_seat_back_a_19.name = "Diamond back inlay seat 1__pivot"; + node_stud_seat_back_a_19.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_a_19) { + node_stud_seat_back_a_19.position.copy(endpoint_stud_seat_back_a_19.start); + node_stud_seat_back_a_19.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_a_19.position.set(1.8611773921832884, 0.0, -0.04558042452830188); + node_stud_seat_back_a_19.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_a_19.userData.sculptComponent = {"id": "stud-seat-back-a", "name": "Diamond back inlay seat 1", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.8611773921832884, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_a_19.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_a_19.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_a_19); + nodes["stud-seat-back-a"] = node_stud_seat_back_a_19; + const mesh_stud_seat_back_a_19Geometry = endpoint_stud_seat_back_a_19 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_a_19.endRadius, endpoint_stud_seat_back_a_19.baseRadius, endpoint_stud_seat_back_a_19.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_a_19) { + mesh_stud_seat_back_a_19Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_a_19 = new THREE.Mesh( + mesh_stud_seat_back_a_19Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_a_19.name = "Diamond back inlay seat 1"; + if (endpoint_stud_seat_back_a_19) { + mesh_stud_seat_back_a_19.position.copy(endpoint_stud_seat_back_a_19.midpoint); + mesh_stud_seat_back_a_19.quaternion.copy(endpoint_stud_seat_back_a_19.quaternion); + } + mesh_stud_seat_back_a_19.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_a_19.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_a_19.userData.sculptComponent = {"id": "stud-seat-back-a", "name": "Diamond back inlay seat 1", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.8611773921832884, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_a_19.userData.explodeWithParent = "handle"; + node_stud_seat_back_a_19.add(mesh_stud_seat_back_a_19); + meshes["stud-seat-back-a"] = mesh_stud_seat_back_a_19; + colliders["stud-seat-back-a"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_a_19); + + const endpoint_stud_seat_back_b_20 = makeAttachmentEndpoint(null); + const node_stud_seat_back_b_20 = new THREE.Group(); + node_stud_seat_back_b_20.name = "Diamond back inlay seat 2__pivot"; + node_stud_seat_back_b_20.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_b_20) { + node_stud_seat_back_b_20.position.copy(endpoint_stud_seat_back_b_20.start); + node_stud_seat_back_b_20.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_b_20.position.set(1.9028300202156334, 0.0, -0.04558042452830188); + node_stud_seat_back_b_20.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_b_20.userData.sculptComponent = {"id": "stud-seat-back-b", "name": "Diamond back inlay seat 2", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9028300202156334, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_b_20.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_b_20.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_b_20); + nodes["stud-seat-back-b"] = node_stud_seat_back_b_20; + const mesh_stud_seat_back_b_20Geometry = endpoint_stud_seat_back_b_20 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_b_20.endRadius, endpoint_stud_seat_back_b_20.baseRadius, endpoint_stud_seat_back_b_20.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_b_20) { + mesh_stud_seat_back_b_20Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_b_20 = new THREE.Mesh( + mesh_stud_seat_back_b_20Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_b_20.name = "Diamond back inlay seat 2"; + if (endpoint_stud_seat_back_b_20) { + mesh_stud_seat_back_b_20.position.copy(endpoint_stud_seat_back_b_20.midpoint); + mesh_stud_seat_back_b_20.quaternion.copy(endpoint_stud_seat_back_b_20.quaternion); + } + mesh_stud_seat_back_b_20.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_b_20.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_b_20.userData.sculptComponent = {"id": "stud-seat-back-b", "name": "Diamond back inlay seat 2", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9028300202156334, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_b_20.userData.explodeWithParent = "handle"; + node_stud_seat_back_b_20.add(mesh_stud_seat_back_b_20); + meshes["stud-seat-back-b"] = mesh_stud_seat_back_b_20; + colliders["stud-seat-back-b"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_b_20); + + const endpoint_stud_seat_back_c_21 = makeAttachmentEndpoint(null); + const node_stud_seat_back_c_21 = new THREE.Group(); + node_stud_seat_back_c_21.name = "Diamond back inlay seat 3__pivot"; + node_stud_seat_back_c_21.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_c_21) { + node_stud_seat_back_c_21.position.copy(endpoint_stud_seat_back_c_21.start); + node_stud_seat_back_c_21.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_c_21.position.set(1.9444826482479782, 0.0, -0.04558042452830188); + node_stud_seat_back_c_21.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_c_21.userData.sculptComponent = {"id": "stud-seat-back-c", "name": "Diamond back inlay seat 3", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9444826482479782, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_c_21.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_c_21.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_c_21); + nodes["stud-seat-back-c"] = node_stud_seat_back_c_21; + const mesh_stud_seat_back_c_21Geometry = endpoint_stud_seat_back_c_21 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_c_21.endRadius, endpoint_stud_seat_back_c_21.baseRadius, endpoint_stud_seat_back_c_21.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_c_21) { + mesh_stud_seat_back_c_21Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_c_21 = new THREE.Mesh( + mesh_stud_seat_back_c_21Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_c_21.name = "Diamond back inlay seat 3"; + if (endpoint_stud_seat_back_c_21) { + mesh_stud_seat_back_c_21.position.copy(endpoint_stud_seat_back_c_21.midpoint); + mesh_stud_seat_back_c_21.quaternion.copy(endpoint_stud_seat_back_c_21.quaternion); + } + mesh_stud_seat_back_c_21.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_c_21.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_c_21.userData.sculptComponent = {"id": "stud-seat-back-c", "name": "Diamond back inlay seat 3", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9444826482479782, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_c_21.userData.explodeWithParent = "handle"; + node_stud_seat_back_c_21.add(mesh_stud_seat_back_c_21); + meshes["stud-seat-back-c"] = mesh_stud_seat_back_c_21; + colliders["stud-seat-back-c"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_c_21); + + const endpoint_stud_seat_back_d_22 = makeAttachmentEndpoint(null); + const node_stud_seat_back_d_22 = new THREE.Group(); + node_stud_seat_back_d_22.name = "Diamond back inlay seat 4__pivot"; + node_stud_seat_back_d_22.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_d_22) { + node_stud_seat_back_d_22.position.copy(endpoint_stud_seat_back_d_22.start); + node_stud_seat_back_d_22.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_d_22.position.set(1.9861352762803233, 0.0, -0.04558042452830188); + node_stud_seat_back_d_22.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_d_22.userData.sculptComponent = {"id": "stud-seat-back-d", "name": "Diamond back inlay seat 4", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9861352762803233, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_d_22.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_d_22.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_d_22); + nodes["stud-seat-back-d"] = node_stud_seat_back_d_22; + const mesh_stud_seat_back_d_22Geometry = endpoint_stud_seat_back_d_22 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_d_22.endRadius, endpoint_stud_seat_back_d_22.baseRadius, endpoint_stud_seat_back_d_22.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_d_22) { + mesh_stud_seat_back_d_22Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_d_22 = new THREE.Mesh( + mesh_stud_seat_back_d_22Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_d_22.name = "Diamond back inlay seat 4"; + if (endpoint_stud_seat_back_d_22) { + mesh_stud_seat_back_d_22.position.copy(endpoint_stud_seat_back_d_22.midpoint); + mesh_stud_seat_back_d_22.quaternion.copy(endpoint_stud_seat_back_d_22.quaternion); + } + mesh_stud_seat_back_d_22.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_d_22.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_d_22.userData.sculptComponent = {"id": "stud-seat-back-d", "name": "Diamond back inlay seat 4", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [1.9861352762803233, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_d_22.userData.explodeWithParent = "handle"; + node_stud_seat_back_d_22.add(mesh_stud_seat_back_d_22); + meshes["stud-seat-back-d"] = mesh_stud_seat_back_d_22; + colliders["stud-seat-back-d"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_d_22); + + const endpoint_stud_seat_back_e_23 = makeAttachmentEndpoint(null); + const node_stud_seat_back_e_23 = new THREE.Group(); + node_stud_seat_back_e_23.name = "Diamond back inlay seat 5__pivot"; + node_stud_seat_back_e_23.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_e_23) { + node_stud_seat_back_e_23.position.copy(endpoint_stud_seat_back_e_23.start); + node_stud_seat_back_e_23.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_e_23.position.set(2.0277879043126683, 0.0, -0.04558042452830188); + node_stud_seat_back_e_23.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_e_23.userData.sculptComponent = {"id": "stud-seat-back-e", "name": "Diamond back inlay seat 5", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0277879043126683, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_e_23.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_e_23.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_e_23); + nodes["stud-seat-back-e"] = node_stud_seat_back_e_23; + const mesh_stud_seat_back_e_23Geometry = endpoint_stud_seat_back_e_23 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_e_23.endRadius, endpoint_stud_seat_back_e_23.baseRadius, endpoint_stud_seat_back_e_23.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_e_23) { + mesh_stud_seat_back_e_23Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_e_23 = new THREE.Mesh( + mesh_stud_seat_back_e_23Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_e_23.name = "Diamond back inlay seat 5"; + if (endpoint_stud_seat_back_e_23) { + mesh_stud_seat_back_e_23.position.copy(endpoint_stud_seat_back_e_23.midpoint); + mesh_stud_seat_back_e_23.quaternion.copy(endpoint_stud_seat_back_e_23.quaternion); + } + mesh_stud_seat_back_e_23.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_e_23.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_e_23.userData.sculptComponent = {"id": "stud-seat-back-e", "name": "Diamond back inlay seat 5", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0277879043126683, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_e_23.userData.explodeWithParent = "handle"; + node_stud_seat_back_e_23.add(mesh_stud_seat_back_e_23); + meshes["stud-seat-back-e"] = mesh_stud_seat_back_e_23; + colliders["stud-seat-back-e"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_e_23); + + const endpoint_stud_seat_back_f_24 = makeAttachmentEndpoint(null); + const node_stud_seat_back_f_24 = new THREE.Group(); + node_stud_seat_back_f_24.name = "Diamond back inlay seat 6__pivot"; + node_stud_seat_back_f_24.scale.set(1, 1, 1); + if (endpoint_stud_seat_back_f_24) { + node_stud_seat_back_f_24.position.copy(endpoint_stud_seat_back_f_24.start); + node_stud_seat_back_f_24.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_seat_back_f_24.position.set(2.0694405323450136, 0.0, -0.04558042452830188); + node_stud_seat_back_f_24.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_seat_back_f_24.userData.sculptComponent = {"id": "stud-seat-back-f", "name": "Diamond back inlay seat 6", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0694405323450136, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + node_stud_seat_back_f_24.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}; + node_stud_seat_back_f_24.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_seat_back_f_24); + nodes["stud-seat-back-f"] = node_stud_seat_back_f_24; + const mesh_stud_seat_back_f_24Geometry = endpoint_stud_seat_back_f_24 + ? new THREE.CylinderGeometry(endpoint_stud_seat_back_f_24.endRadius, endpoint_stud_seat_back_f_24.baseRadius, endpoint_stud_seat_back_f_24.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_seat_back_f_24) { + mesh_stud_seat_back_f_24Geometry.scale(0.029, 0.021, 0.001); + } + const mesh_stud_seat_back_f_24 = new THREE.Mesh( + mesh_stud_seat_back_f_24Geometry, + materialMap["wrap-seam"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_seat_back_f_24.name = "Diamond back inlay seat 6"; + if (endpoint_stud_seat_back_f_24) { + mesh_stud_seat_back_f_24.position.copy(endpoint_stud_seat_back_f_24.midpoint); + mesh_stud_seat_back_f_24.quaternion.copy(endpoint_stud_seat_back_f_24.quaternion); + } + mesh_stud_seat_back_f_24.castShadow = options.castShadow ?? true; + mesh_stud_seat_back_f_24.receiveShadow = options.receiveShadow ?? true; + mesh_stud_seat_back_f_24.userData.sculptComponent = {"id": "stud-seat-back-f", "name": "Diamond back inlay seat 6", "level": "micro", "role": "detail", "importance": 0.48, "confidence": 0.78, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Dark shallow socket leaves a narrow wrap-colored border around the back gilt lozenge.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay seat 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.029, "height": 0.021, "depth": 0.001, "units": "relative", "confidence": 0.78}, "transform": {"position": [2.0694405323450136, 0.0, -0.04558042452830188], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.029, 0.021, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "wrap-seam"}}, "material": "wrap-seam", "materialLayers": ["wrap-seam"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.78, "microRoughness": 0.86, "bumpAmplitude": 0.012, "normalPattern": "cord-wrap", "displacementPattern": "wrap-turn ridges", "occlusionPattern": "valleys between turns", "edgeWearPattern": "none", "notes": "Dark wrapped grip from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(36, 22, 16, 1.0)", "secondaryAlbedo": "rgba(22, 13, 9, 1.0)", "materialClass": "fabric", "materialClassConfidence": 0.72}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "bake"}; + mesh_stud_seat_back_f_24.userData.explodeWithParent = "handle"; + node_stud_seat_back_f_24.add(mesh_stud_seat_back_f_24); + meshes["stud-seat-back-f"] = mesh_stud_seat_back_f_24; + colliders["stud-seat-back-f"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_seat_back_f_24); + + const endpoint_stud_a_25 = makeAttachmentEndpoint(null); + const node_stud_a_25 = new THREE.Group(); + node_stud_a_25.name = "Diamond inlay 1__pivot"; + node_stud_a_25.scale.set(1, 1, 1); + if (endpoint_stud_a_25) { + node_stud_a_25.position.copy(endpoint_stud_a_25.start); + node_stud_a_25.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_a_25.position.set(1.8611773921832884, 0.0, 0.04598042452830189); + node_stud_a_25.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_a_25.userData.sculptComponent = {"id": "stud-a", "name": "Diamond inlay 1", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.8611773921832884, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_a_25.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_a_25.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_a_25); + nodes["stud-a"] = node_stud_a_25; + const mesh_stud_a_25Geometry = endpoint_stud_a_25 + ? new THREE.CylinderGeometry(endpoint_stud_a_25.endRadius, endpoint_stud_a_25.baseRadius, endpoint_stud_a_25.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_a_25) { + mesh_stud_a_25Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_a_25 = new THREE.Mesh( + mesh_stud_a_25Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_a_25.name = "Diamond inlay 1"; + if (endpoint_stud_a_25) { + mesh_stud_a_25.position.copy(endpoint_stud_a_25.midpoint); + mesh_stud_a_25.quaternion.copy(endpoint_stud_a_25.quaternion); + } + mesh_stud_a_25.castShadow = options.castShadow ?? true; + mesh_stud_a_25.receiveShadow = options.receiveShadow ?? true; + mesh_stud_a_25.userData.sculptComponent = {"id": "stud-a", "name": "Diamond inlay 1", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.8611773921832884, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_a_25.userData.explodeWithParent = "handle"; + node_stud_a_25.add(mesh_stud_a_25); + meshes["stud-a"] = mesh_stud_a_25; + colliders["stud-a"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_a_25); + + const endpoint_stud_b_26 = makeAttachmentEndpoint(null); + const node_stud_b_26 = new THREE.Group(); + node_stud_b_26.name = "Diamond inlay 2__pivot"; + node_stud_b_26.scale.set(1, 1, 1); + if (endpoint_stud_b_26) { + node_stud_b_26.position.copy(endpoint_stud_b_26.start); + node_stud_b_26.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_b_26.position.set(1.9028300202156334, 0.0, 0.04598042452830189); + node_stud_b_26.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_b_26.userData.sculptComponent = {"id": "stud-b", "name": "Diamond inlay 2", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9028300202156334, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_b_26.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_b_26.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_b_26); + nodes["stud-b"] = node_stud_b_26; + const mesh_stud_b_26Geometry = endpoint_stud_b_26 + ? new THREE.CylinderGeometry(endpoint_stud_b_26.endRadius, endpoint_stud_b_26.baseRadius, endpoint_stud_b_26.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_b_26) { + mesh_stud_b_26Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_b_26 = new THREE.Mesh( + mesh_stud_b_26Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_b_26.name = "Diamond inlay 2"; + if (endpoint_stud_b_26) { + mesh_stud_b_26.position.copy(endpoint_stud_b_26.midpoint); + mesh_stud_b_26.quaternion.copy(endpoint_stud_b_26.quaternion); + } + mesh_stud_b_26.castShadow = options.castShadow ?? true; + mesh_stud_b_26.receiveShadow = options.receiveShadow ?? true; + mesh_stud_b_26.userData.sculptComponent = {"id": "stud-b", "name": "Diamond inlay 2", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9028300202156334, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_b_26.userData.explodeWithParent = "handle"; + node_stud_b_26.add(mesh_stud_b_26); + meshes["stud-b"] = mesh_stud_b_26; + colliders["stud-b"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_b_26); + + const endpoint_stud_c_27 = makeAttachmentEndpoint(null); + const node_stud_c_27 = new THREE.Group(); + node_stud_c_27.name = "Diamond inlay 3__pivot"; + node_stud_c_27.scale.set(1, 1, 1); + if (endpoint_stud_c_27) { + node_stud_c_27.position.copy(endpoint_stud_c_27.start); + node_stud_c_27.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_c_27.position.set(1.9444826482479782, 0.0, 0.04598042452830189); + node_stud_c_27.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_c_27.userData.sculptComponent = {"id": "stud-c", "name": "Diamond inlay 3", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9444826482479782, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_c_27.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_c_27.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_c_27); + nodes["stud-c"] = node_stud_c_27; + const mesh_stud_c_27Geometry = endpoint_stud_c_27 + ? new THREE.CylinderGeometry(endpoint_stud_c_27.endRadius, endpoint_stud_c_27.baseRadius, endpoint_stud_c_27.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_c_27) { + mesh_stud_c_27Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_c_27 = new THREE.Mesh( + mesh_stud_c_27Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_c_27.name = "Diamond inlay 3"; + if (endpoint_stud_c_27) { + mesh_stud_c_27.position.copy(endpoint_stud_c_27.midpoint); + mesh_stud_c_27.quaternion.copy(endpoint_stud_c_27.quaternion); + } + mesh_stud_c_27.castShadow = options.castShadow ?? true; + mesh_stud_c_27.receiveShadow = options.receiveShadow ?? true; + mesh_stud_c_27.userData.sculptComponent = {"id": "stud-c", "name": "Diamond inlay 3", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9444826482479782, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_c_27.userData.explodeWithParent = "handle"; + node_stud_c_27.add(mesh_stud_c_27); + meshes["stud-c"] = mesh_stud_c_27; + colliders["stud-c"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_c_27); + + const endpoint_stud_d_28 = makeAttachmentEndpoint(null); + const node_stud_d_28 = new THREE.Group(); + node_stud_d_28.name = "Diamond inlay 4__pivot"; + node_stud_d_28.scale.set(1, 1, 1); + if (endpoint_stud_d_28) { + node_stud_d_28.position.copy(endpoint_stud_d_28.start); + node_stud_d_28.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_d_28.position.set(1.9861352762803233, 0.0, 0.04598042452830189); + node_stud_d_28.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_d_28.userData.sculptComponent = {"id": "stud-d", "name": "Diamond inlay 4", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9861352762803233, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_d_28.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_d_28.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_d_28); + nodes["stud-d"] = node_stud_d_28; + const mesh_stud_d_28Geometry = endpoint_stud_d_28 + ? new THREE.CylinderGeometry(endpoint_stud_d_28.endRadius, endpoint_stud_d_28.baseRadius, endpoint_stud_d_28.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_d_28) { + mesh_stud_d_28Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_d_28 = new THREE.Mesh( + mesh_stud_d_28Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_d_28.name = "Diamond inlay 4"; + if (endpoint_stud_d_28) { + mesh_stud_d_28.position.copy(endpoint_stud_d_28.midpoint); + mesh_stud_d_28.quaternion.copy(endpoint_stud_d_28.quaternion); + } + mesh_stud_d_28.castShadow = options.castShadow ?? true; + mesh_stud_d_28.receiveShadow = options.receiveShadow ?? true; + mesh_stud_d_28.userData.sculptComponent = {"id": "stud-d", "name": "Diamond inlay 4", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9861352762803233, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_d_28.userData.explodeWithParent = "handle"; + node_stud_d_28.add(mesh_stud_d_28); + meshes["stud-d"] = mesh_stud_d_28; + colliders["stud-d"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_d_28); + + const endpoint_stud_e_29 = makeAttachmentEndpoint(null); + const node_stud_e_29 = new THREE.Group(); + node_stud_e_29.name = "Diamond inlay 5__pivot"; + node_stud_e_29.scale.set(1, 1, 1); + if (endpoint_stud_e_29) { + node_stud_e_29.position.copy(endpoint_stud_e_29.start); + node_stud_e_29.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_e_29.position.set(2.0277879043126683, 0.0, 0.04598042452830189); + node_stud_e_29.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_e_29.userData.sculptComponent = {"id": "stud-e", "name": "Diamond inlay 5", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0277879043126683, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_e_29.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_e_29.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_e_29); + nodes["stud-e"] = node_stud_e_29; + const mesh_stud_e_29Geometry = endpoint_stud_e_29 + ? new THREE.CylinderGeometry(endpoint_stud_e_29.endRadius, endpoint_stud_e_29.baseRadius, endpoint_stud_e_29.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_e_29) { + mesh_stud_e_29Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_e_29 = new THREE.Mesh( + mesh_stud_e_29Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_e_29.name = "Diamond inlay 5"; + if (endpoint_stud_e_29) { + mesh_stud_e_29.position.copy(endpoint_stud_e_29.midpoint); + mesh_stud_e_29.quaternion.copy(endpoint_stud_e_29.quaternion); + } + mesh_stud_e_29.castShadow = options.castShadow ?? true; + mesh_stud_e_29.receiveShadow = options.receiveShadow ?? true; + mesh_stud_e_29.userData.sculptComponent = {"id": "stud-e", "name": "Diamond inlay 5", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0277879043126683, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_e_29.userData.explodeWithParent = "handle"; + node_stud_e_29.add(mesh_stud_e_29); + meshes["stud-e"] = mesh_stud_e_29; + colliders["stud-e"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_e_29); + + const endpoint_stud_f_30 = makeAttachmentEndpoint(null); + const node_stud_f_30 = new THREE.Group(); + node_stud_f_30.name = "Diamond inlay 6__pivot"; + node_stud_f_30.scale.set(1, 1, 1); + if (endpoint_stud_f_30) { + node_stud_f_30.position.copy(endpoint_stud_f_30.start); + node_stud_f_30.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_f_30.position.set(2.0694405323450136, 0.0, 0.04598042452830189); + node_stud_f_30.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_f_30.userData.sculptComponent = {"id": "stud-f", "name": "Diamond inlay 6", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0694405323450136, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + node_stud_f_30.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_f_30.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_f_30); + nodes["stud-f"] = node_stud_f_30; + const mesh_stud_f_30Geometry = endpoint_stud_f_30 + ? new THREE.CylinderGeometry(endpoint_stud_f_30.endRadius, endpoint_stud_f_30.baseRadius, endpoint_stud_f_30.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_f_30) { + mesh_stud_f_30Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_f_30 = new THREE.Mesh( + mesh_stud_f_30Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_f_30.name = "Diamond inlay 6"; + if (endpoint_stud_f_30) { + mesh_stud_f_30.position.copy(endpoint_stud_f_30.midpoint); + mesh_stud_f_30.quaternion.copy(endpoint_stud_f_30.quaternion); + } + mesh_stud_f_30.castShadow = options.castShadow ?? true; + mesh_stud_f_30.receiveShadow = options.receiveShadow ?? true; + mesh_stud_f_30.userData.sculptComponent = {"id": "stud-f", "name": "Diamond inlay 6", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark front wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond inlay 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0694405323450136, 0.0, 0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "front", "mergePolicy": "keep"}; + mesh_stud_f_30.userData.explodeWithParent = "handle"; + node_stud_f_30.add(mesh_stud_f_30); + meshes["stud-f"] = mesh_stud_f_30; + colliders["stud-f"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_f_30); + + const endpoint_stud_back_a_31 = makeAttachmentEndpoint(null); + const node_stud_back_a_31 = new THREE.Group(); + node_stud_back_a_31.name = "Diamond back inlay 1__pivot"; + node_stud_back_a_31.scale.set(1, 1, 1); + if (endpoint_stud_back_a_31) { + node_stud_back_a_31.position.copy(endpoint_stud_back_a_31.start); + node_stud_back_a_31.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_a_31.position.set(1.8611773921832884, 0.0, -0.04598042452830189); + node_stud_back_a_31.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_a_31.userData.sculptComponent = {"id": "stud-back-a", "name": "Diamond back inlay 1", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.8611773921832884, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_a_31.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_a_31.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_a_31); + nodes["stud-back-a"] = node_stud_back_a_31; + const mesh_stud_back_a_31Geometry = endpoint_stud_back_a_31 + ? new THREE.CylinderGeometry(endpoint_stud_back_a_31.endRadius, endpoint_stud_back_a_31.baseRadius, endpoint_stud_back_a_31.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_a_31) { + mesh_stud_back_a_31Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_a_31 = new THREE.Mesh( + mesh_stud_back_a_31Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_a_31.name = "Diamond back inlay 1"; + if (endpoint_stud_back_a_31) { + mesh_stud_back_a_31.position.copy(endpoint_stud_back_a_31.midpoint); + mesh_stud_back_a_31.quaternion.copy(endpoint_stud_back_a_31.quaternion); + } + mesh_stud_back_a_31.castShadow = options.castShadow ?? true; + mesh_stud_back_a_31.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_a_31.userData.sculptComponent = {"id": "stud-back-a", "name": "Diamond back inlay 1", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 1 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.8611773921832884, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_a_31.userData.explodeWithParent = "handle"; + node_stud_back_a_31.add(mesh_stud_back_a_31); + meshes["stud-back-a"] = mesh_stud_back_a_31; + colliders["stud-back-a"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_a_31); + + const endpoint_stud_back_b_32 = makeAttachmentEndpoint(null); + const node_stud_back_b_32 = new THREE.Group(); + node_stud_back_b_32.name = "Diamond back inlay 2__pivot"; + node_stud_back_b_32.scale.set(1, 1, 1); + if (endpoint_stud_back_b_32) { + node_stud_back_b_32.position.copy(endpoint_stud_back_b_32.start); + node_stud_back_b_32.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_b_32.position.set(1.9028300202156334, 0.0, -0.04598042452830189); + node_stud_back_b_32.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_b_32.userData.sculptComponent = {"id": "stud-back-b", "name": "Diamond back inlay 2", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9028300202156334, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_b_32.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_b_32.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_b_32); + nodes["stud-back-b"] = node_stud_back_b_32; + const mesh_stud_back_b_32Geometry = endpoint_stud_back_b_32 + ? new THREE.CylinderGeometry(endpoint_stud_back_b_32.endRadius, endpoint_stud_back_b_32.baseRadius, endpoint_stud_back_b_32.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_b_32) { + mesh_stud_back_b_32Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_b_32 = new THREE.Mesh( + mesh_stud_back_b_32Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_b_32.name = "Diamond back inlay 2"; + if (endpoint_stud_back_b_32) { + mesh_stud_back_b_32.position.copy(endpoint_stud_back_b_32.midpoint); + mesh_stud_back_b_32.quaternion.copy(endpoint_stud_back_b_32.quaternion); + } + mesh_stud_back_b_32.castShadow = options.castShadow ?? true; + mesh_stud_back_b_32.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_b_32.userData.sculptComponent = {"id": "stud-back-b", "name": "Diamond back inlay 2", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 2 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9028300202156334, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_b_32.userData.explodeWithParent = "handle"; + node_stud_back_b_32.add(mesh_stud_back_b_32); + meshes["stud-back-b"] = mesh_stud_back_b_32; + colliders["stud-back-b"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_b_32); + + const endpoint_stud_back_c_33 = makeAttachmentEndpoint(null); + const node_stud_back_c_33 = new THREE.Group(); + node_stud_back_c_33.name = "Diamond back inlay 3__pivot"; + node_stud_back_c_33.scale.set(1, 1, 1); + if (endpoint_stud_back_c_33) { + node_stud_back_c_33.position.copy(endpoint_stud_back_c_33.start); + node_stud_back_c_33.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_c_33.position.set(1.9444826482479782, 0.0, -0.04598042452830189); + node_stud_back_c_33.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_c_33.userData.sculptComponent = {"id": "stud-back-c", "name": "Diamond back inlay 3", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9444826482479782, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_c_33.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_c_33.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_c_33); + nodes["stud-back-c"] = node_stud_back_c_33; + const mesh_stud_back_c_33Geometry = endpoint_stud_back_c_33 + ? new THREE.CylinderGeometry(endpoint_stud_back_c_33.endRadius, endpoint_stud_back_c_33.baseRadius, endpoint_stud_back_c_33.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_c_33) { + mesh_stud_back_c_33Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_c_33 = new THREE.Mesh( + mesh_stud_back_c_33Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_c_33.name = "Diamond back inlay 3"; + if (endpoint_stud_back_c_33) { + mesh_stud_back_c_33.position.copy(endpoint_stud_back_c_33.midpoint); + mesh_stud_back_c_33.quaternion.copy(endpoint_stud_back_c_33.quaternion); + } + mesh_stud_back_c_33.castShadow = options.castShadow ?? true; + mesh_stud_back_c_33.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_c_33.userData.sculptComponent = {"id": "stud-back-c", "name": "Diamond back inlay 3", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 3 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9444826482479782, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_c_33.userData.explodeWithParent = "handle"; + node_stud_back_c_33.add(mesh_stud_back_c_33); + meshes["stud-back-c"] = mesh_stud_back_c_33; + colliders["stud-back-c"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_c_33); + + const endpoint_stud_back_d_34 = makeAttachmentEndpoint(null); + const node_stud_back_d_34 = new THREE.Group(); + node_stud_back_d_34.name = "Diamond back inlay 4__pivot"; + node_stud_back_d_34.scale.set(1, 1, 1); + if (endpoint_stud_back_d_34) { + node_stud_back_d_34.position.copy(endpoint_stud_back_d_34.start); + node_stud_back_d_34.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_d_34.position.set(1.9861352762803233, 0.0, -0.04598042452830189); + node_stud_back_d_34.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_d_34.userData.sculptComponent = {"id": "stud-back-d", "name": "Diamond back inlay 4", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9861352762803233, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_d_34.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_d_34.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_d_34); + nodes["stud-back-d"] = node_stud_back_d_34; + const mesh_stud_back_d_34Geometry = endpoint_stud_back_d_34 + ? new THREE.CylinderGeometry(endpoint_stud_back_d_34.endRadius, endpoint_stud_back_d_34.baseRadius, endpoint_stud_back_d_34.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_d_34) { + mesh_stud_back_d_34Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_d_34 = new THREE.Mesh( + mesh_stud_back_d_34Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_d_34.name = "Diamond back inlay 4"; + if (endpoint_stud_back_d_34) { + mesh_stud_back_d_34.position.copy(endpoint_stud_back_d_34.midpoint); + mesh_stud_back_d_34.quaternion.copy(endpoint_stud_back_d_34.quaternion); + } + mesh_stud_back_d_34.castShadow = options.castShadow ?? true; + mesh_stud_back_d_34.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_d_34.userData.sculptComponent = {"id": "stud-back-d", "name": "Diamond back inlay 4", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 4 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [1.9861352762803233, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_d_34.userData.explodeWithParent = "handle"; + node_stud_back_d_34.add(mesh_stud_back_d_34); + meshes["stud-back-d"] = mesh_stud_back_d_34; + colliders["stud-back-d"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_d_34); + + const endpoint_stud_back_e_35 = makeAttachmentEndpoint(null); + const node_stud_back_e_35 = new THREE.Group(); + node_stud_back_e_35.name = "Diamond back inlay 5__pivot"; + node_stud_back_e_35.scale.set(1, 1, 1); + if (endpoint_stud_back_e_35) { + node_stud_back_e_35.position.copy(endpoint_stud_back_e_35.start); + node_stud_back_e_35.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_e_35.position.set(2.0277879043126683, 0.0, -0.04598042452830189); + node_stud_back_e_35.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_e_35.userData.sculptComponent = {"id": "stud-back-e", "name": "Diamond back inlay 5", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0277879043126683, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_e_35.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_e_35.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_e_35); + nodes["stud-back-e"] = node_stud_back_e_35; + const mesh_stud_back_e_35Geometry = endpoint_stud_back_e_35 + ? new THREE.CylinderGeometry(endpoint_stud_back_e_35.endRadius, endpoint_stud_back_e_35.baseRadius, endpoint_stud_back_e_35.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_e_35) { + mesh_stud_back_e_35Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_e_35 = new THREE.Mesh( + mesh_stud_back_e_35Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_e_35.name = "Diamond back inlay 5"; + if (endpoint_stud_back_e_35) { + mesh_stud_back_e_35.position.copy(endpoint_stud_back_e_35.midpoint); + mesh_stud_back_e_35.quaternion.copy(endpoint_stud_back_e_35.quaternion); + } + mesh_stud_back_e_35.castShadow = options.castShadow ?? true; + mesh_stud_back_e_35.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_e_35.userData.sculptComponent = {"id": "stud-back-e", "name": "Diamond back inlay 5", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 5 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0277879043126683, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_e_35.userData.explodeWithParent = "handle"; + node_stud_back_e_35.add(mesh_stud_back_e_35); + meshes["stud-back-e"] = mesh_stud_back_e_35; + colliders["stud-back-e"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_e_35); + + const endpoint_stud_back_f_36 = makeAttachmentEndpoint(null); + const node_stud_back_f_36 = new THREE.Group(); + node_stud_back_f_36.name = "Diamond back inlay 6__pivot"; + node_stud_back_f_36.scale.set(1, 1, 1); + if (endpoint_stud_back_f_36) { + node_stud_back_f_36.position.copy(endpoint_stud_back_f_36.start); + node_stud_back_f_36.rotation.set(0.0, 0.0, 0.7853981633974483); + } else { + node_stud_back_f_36.position.set(2.0694405323450136, 0.0, -0.04598042452830189); + node_stud_back_f_36.rotation.set(0.0, 0.0, 0.7853981633974483); + } + node_stud_back_f_36.userData.sculptComponent = {"id": "stud-back-f", "name": "Diamond back inlay 6", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0694405323450136, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + node_stud_back_f_36.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_stud_back_f_36.userData.explodeWithParent = "handle"; + (nodes["root"] ?? root).add(node_stud_back_f_36); + nodes["stud-back-f"] = node_stud_back_f_36; + const mesh_stud_back_f_36Geometry = endpoint_stud_back_f_36 + ? new THREE.CylinderGeometry(endpoint_stud_back_f_36.endRadius, endpoint_stud_back_f_36.baseRadius, endpoint_stud_back_f_36.length, 32, 12) + : new THREE.BoxGeometry(1, 1, 1, 12, 12, 12); + if (!endpoint_stud_back_f_36) { + mesh_stud_back_f_36Geometry.scale(0.022, 0.013, 0.001); + } + const mesh_stud_back_f_36 = new THREE.Mesh( + mesh_stud_back_f_36Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_stud_back_f_36.name = "Diamond back inlay 6"; + if (endpoint_stud_back_f_36) { + mesh_stud_back_f_36.position.copy(endpoint_stud_back_f_36.midpoint); + mesh_stud_back_f_36.quaternion.copy(endpoint_stud_back_f_36.quaternion); + } + mesh_stud_back_f_36.castShadow = options.castShadow ?? true; + mesh_stud_back_f_36.receiveShadow = options.receiveShadow ?? true; + mesh_stud_back_f_36.userData.sculptComponent = {"id": "stud-back-f", "name": "Diamond back inlay 6", "level": "micro", "role": "detail", "importance": 0.55, "confidence": 0.82, "primitive": "box", "topologyClass": "assembled-solid", "topologyRationale": "Small gilt lozenge sits nearly flush inside a larger dark back wrap socket.", "geometryDescriptor": {"topologyIntent": "Diamond back inlay 6 reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": null, "dimensions": {"width": 0.022, "height": 0.013, "depth": 0.001, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.0694405323450136, 0.0, -0.04598042452830189], "rotation": [0.0, 0.0, 0.7853981633974483], "scale": [0.022, 0.013, 0.001]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "handle", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "handle", "ownerModule": "handle", "face": "back", "mergePolicy": "keep"}; + mesh_stud_back_f_36.userData.explodeWithParent = "handle"; + node_stud_back_f_36.add(mesh_stud_back_f_36); + meshes["stud-back-f"] = mesh_stud_back_f_36; + colliders["stud-back-f"] = null; + destructionGroups["handle"] ??= []; + destructionGroups["handle"].push(node_stud_back_f_36); + + const attachment_ferrule_37 = {"parentId": "root", "parentSocket": "handle-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ferrule_37 = makeAttachmentEndpoint(attachment_ferrule_37); + const node_ferrule_37 = new THREE.Group(); + node_ferrule_37.name = "Gilt rear ferrule__pivot"; + node_ferrule_37.scale.set(1, 1, 1); + if (endpoint_ferrule_37) { + node_ferrule_37.position.copy(endpoint_ferrule_37.start); + node_ferrule_37.rotation.set(0.0, 0.0, 1.5707963267948966); + } else { + node_ferrule_37.position.set(2.111873820754717, 0.0, 0.0); + node_ferrule_37.rotation.set(0.0, 0.0, 1.5707963267948966); + } + node_ferrule_37.userData.sculptComponent = {"id": "ferrule", "name": "Gilt rear ferrule", "level": "meso", "role": "body", "importance": 0.8, "confidence": 0.8, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Thin gilt band between wrap and ring. Stops short of the ring so it does not fill the aperture.", "geometryDescriptor": {"topologyIntent": "Gilt rear ferrule reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "handle-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.07594339622641509, "height": 0.01356132075471698, "depth": 0.07594339622641509, "units": "relative", "confidence": 0.8}, "transform": {"position": [2.111873820754717, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.07594339622641509, 0.01356132075471698, 0.07594339622641509]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "rear ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ferrule", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}}; + node_ferrule_37.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "rear ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ferrule", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_ferrule_37.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_ferrule_37); + nodes["ferrule"] = node_ferrule_37; + const mesh_ferrule_37Geometry = endpoint_ferrule_37 + ? new THREE.CylinderGeometry(endpoint_ferrule_37.endRadius, endpoint_ferrule_37.baseRadius, endpoint_ferrule_37.length, 32, 12) + : new THREE.CylinderGeometry(0.5, 0.5, 1, 48, 16); + if (!endpoint_ferrule_37) { + mesh_ferrule_37Geometry.scale(0.07594339622641509, 0.01356132075471698, 0.07594339622641509); + } + const mesh_ferrule_37 = new THREE.Mesh( + mesh_ferrule_37Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ferrule_37.name = "Gilt rear ferrule"; + if (endpoint_ferrule_37) { + mesh_ferrule_37.position.copy(endpoint_ferrule_37.midpoint); + mesh_ferrule_37.quaternion.copy(endpoint_ferrule_37.quaternion); + } + mesh_ferrule_37.castShadow = options.castShadow ?? true; + mesh_ferrule_37.receiveShadow = options.receiveShadow ?? true; + mesh_ferrule_37.userData.sculptComponent = {"id": "ferrule", "name": "Gilt rear ferrule", "level": "meso", "role": "body", "importance": 0.8, "confidence": 0.8, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Thin gilt band between wrap and ring. Stops short of the ring so it does not fill the aperture.", "geometryDescriptor": {"topologyIntent": "Gilt rear ferrule reconstruction", "edgeTreatment": {"type": "chamfer", "bevelRadius": 0.0015, "segments": 2}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "handle-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.07594339622641509, "height": 0.01356132075471698, "depth": 0.07594339622641509, "units": "relative", "confidence": 0.8}, "transform": {"position": [2.111873820754717, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.07594339622641509, 0.01356132075471698, 0.07594339622641509]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "rear ferrule proxy"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ferrule", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}}; + mesh_ferrule_37.userData.explodeWithParent = null; + node_ferrule_37.add(mesh_ferrule_37); + meshes["ferrule"] = mesh_ferrule_37; + colliders["ferrule"] = {"type": "cylinder", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "rear ferrule proxy"}; + destructionGroups["ferrule"] ??= []; + destructionGroups["ferrule"].push(node_ferrule_37); + + const attachment_ring_neck_38 = {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_neck_38 = makeAttachmentEndpoint(attachment_ring_neck_38); + const node_ring_neck_38 = new THREE.Group(); + node_ring_neck_38.name = "Huan-shou neck__pivot"; + node_ring_neck_38.scale.set(1, 1, 1); + if (endpoint_ring_neck_38) { + node_ring_neck_38.position.copy(endpoint_ring_neck_38.start); + node_ring_neck_38.rotation.set(0.0, 0.0, 1.5707963267948966); + } else { + node_ring_neck_38.position.set(2.1221544811320756, 0.0, 0.0); + node_ring_neck_38.rotation.set(0.0, 0.0, 1.5707963267948966); + } + node_ring_neck_38.userData.sculptComponent = {"id": "ring-neck", "name": "Huan-shou neck", "level": "meso", "role": "body", "importance": 0.75, "confidence": 0.82, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Short gilt neck bridges the rear ferrule to the offset ring profile.", "geometryDescriptor": {"topologyIntent": "Huan-shou neck reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.045, "height": 0.018, "depth": 0.045, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.1221544811320756, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.045, 0.018, 0.045]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}, "explodeWithParent": "ring"}; + node_ring_neck_38.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_ring_neck_38.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_neck_38); + nodes["ring-neck"] = node_ring_neck_38; + const mesh_ring_neck_38Geometry = endpoint_ring_neck_38 + ? new THREE.CylinderGeometry(endpoint_ring_neck_38.endRadius, endpoint_ring_neck_38.baseRadius, endpoint_ring_neck_38.length, 32, 12) + : new THREE.CylinderGeometry(0.5, 0.5, 1, 48, 16); + if (!endpoint_ring_neck_38) { + mesh_ring_neck_38Geometry.scale(0.045, 0.018, 0.045); + } + const mesh_ring_neck_38 = new THREE.Mesh( + mesh_ring_neck_38Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_neck_38.name = "Huan-shou neck"; + if (endpoint_ring_neck_38) { + mesh_ring_neck_38.position.copy(endpoint_ring_neck_38.midpoint); + mesh_ring_neck_38.quaternion.copy(endpoint_ring_neck_38.quaternion); + } + mesh_ring_neck_38.castShadow = options.castShadow ?? true; + mesh_ring_neck_38.receiveShadow = options.receiveShadow ?? true; + mesh_ring_neck_38.userData.sculptComponent = {"id": "ring-neck", "name": "Huan-shou neck", "level": "meso", "role": "body", "importance": 0.75, "confidence": 0.82, "primitive": "cylinder", "topologyClass": "assembled-solid", "topologyRationale": "Short gilt neck bridges the rear ferrule to the offset ring profile.", "geometryDescriptor": {"topologyIntent": "Huan-shou neck reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry"}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.01, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.045, "height": 0.018, "depth": 0.045, "units": "relative", "confidence": 0.82}, "transform": {"position": [2.1221544811320756, 0.0, 0.0], "rotation": [0.0, 0.0, 1.5707963267948966], "scale": [0.045, 0.018, 0.045]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring", "handle"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.78}, "explodeWithParent": "ring"}; + mesh_ring_neck_38.userData.explodeWithParent = "ring"; + node_ring_neck_38.add(mesh_ring_neck_38); + meshes["ring-neck"] = mesh_ring_neck_38; + colliders["ring-neck"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_neck_38); + + const endpoint_ring_39 = makeAttachmentEndpoint(null); + const node_ring_39 = new THREE.Group(); + node_ring_39.name = "Huan-shou ring__pivot"; + node_ring_39.scale.set(1, 1, 1); + if (endpoint_ring_39) { + node_ring_39.position.copy(endpoint_ring_39.start); + node_ring_39.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_39.position.set(2.1996544811320757, 0.0, -0.006); + node_ring_39.rotation.set(0.0, 0.0, 0.0); + } + node_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.158, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.158, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; + node_ring_39.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; + node_ring_39.userData.explodeWithParent = null; + (nodes["root"] ?? root).add(node_ring_39); + nodes["ring"] = node_ring_39; + const mesh_ring_39Geometry = endpoint_ring_39 + ? new THREE.CylinderGeometry(endpoint_ring_39.endRadius, endpoint_ring_39.baseRadius, endpoint_ring_39.length, 32, 12) + : buildExtrudeGeometry({"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}); + if (!endpoint_ring_39) { + mesh_ring_39Geometry.scale(0.148, 0.158, 0.012); + } + const mesh_ring_39 = new THREE.Mesh( + mesh_ring_39Geometry, + materialMap["gilt-bronze"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_39.name = "Huan-shou ring"; + if (endpoint_ring_39) { + mesh_ring_39.position.copy(endpoint_ring_39.midpoint); + mesh_ring_39.quaternion.copy(endpoint_ring_39.quaternion); + } + mesh_ring_39.castShadow = options.castShadow ?? true; + mesh_ring_39.receiveShadow = options.receiveShadow ?? true; + mesh_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.158, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.158, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; + mesh_ring_39.userData.explodeWithParent = null; + node_ring_39.add(mesh_ring_39); + meshes["ring"] = mesh_ring_39; + colliders["ring"] = {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_39); + + const attachment_ring_engraving_outer_40 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_outer_40 = makeAttachmentEndpoint(attachment_ring_engraving_outer_40); + const node_ring_engraving_outer_40 = new THREE.Group(); + node_ring_engraving_outer_40.name = "Ring engraving outer__pivot"; + node_ring_engraving_outer_40.scale.set(1, 1, 1); + if (endpoint_ring_engraving_outer_40) { + node_ring_engraving_outer_40.position.copy(endpoint_ring_engraving_outer_40.start); + node_ring_engraving_outer_40.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_outer_40.position.set(0.0, 0.0, 0.0); + node_ring_engraving_outer_40.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_outer_40.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_outer_40.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_outer_40); + nodes["ring-engraving-outer"] = node_ring_engraving_outer_40; + const mesh_ring_engraving_outer_40Geometry = endpoint_ring_engraving_outer_40 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_outer_40.endRadius, endpoint_ring_engraving_outer_40.baseRadius, endpoint_ring_engraving_outer_40.length, 32, 12) + : buildTubeGeometry({"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_outer_40) { + mesh_ring_engraving_outer_40Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_outer_40 = new THREE.Mesh( + mesh_ring_engraving_outer_40Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_outer_40.name = "Ring engraving outer"; + if (endpoint_ring_engraving_outer_40) { + mesh_ring_engraving_outer_40.position.copy(endpoint_ring_engraving_outer_40.midpoint); + mesh_ring_engraving_outer_40.quaternion.copy(endpoint_ring_engraving_outer_40.quaternion); + } + mesh_ring_engraving_outer_40.castShadow = options.castShadow ?? true; + mesh_ring_engraving_outer_40.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_outer_40.userData.explodeWithParent = "ring"; + node_ring_engraving_outer_40.add(mesh_ring_engraving_outer_40); + meshes["ring-engraving-outer"] = mesh_ring_engraving_outer_40; + colliders["ring-engraving-outer"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_outer_40); + + const attachment_ring_engraving_middle_41 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_middle_41 = makeAttachmentEndpoint(attachment_ring_engraving_middle_41); + const node_ring_engraving_middle_41 = new THREE.Group(); + node_ring_engraving_middle_41.name = "Ring engraving middle__pivot"; + node_ring_engraving_middle_41.scale.set(1, 1, 1); + if (endpoint_ring_engraving_middle_41) { + node_ring_engraving_middle_41.position.copy(endpoint_ring_engraving_middle_41.start); + node_ring_engraving_middle_41.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_middle_41.position.set(0.0, 0.0, 0.0); + node_ring_engraving_middle_41.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_middle_41.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_middle_41.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_middle_41); + nodes["ring-engraving-middle"] = node_ring_engraving_middle_41; + const mesh_ring_engraving_middle_41Geometry = endpoint_ring_engraving_middle_41 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_middle_41.endRadius, endpoint_ring_engraving_middle_41.baseRadius, endpoint_ring_engraving_middle_41.length, 32, 12) + : buildTubeGeometry({"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_middle_41) { + mesh_ring_engraving_middle_41Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_middle_41 = new THREE.Mesh( + mesh_ring_engraving_middle_41Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_middle_41.name = "Ring engraving middle"; + if (endpoint_ring_engraving_middle_41) { + mesh_ring_engraving_middle_41.position.copy(endpoint_ring_engraving_middle_41.midpoint); + mesh_ring_engraving_middle_41.quaternion.copy(endpoint_ring_engraving_middle_41.quaternion); + } + mesh_ring_engraving_middle_41.castShadow = options.castShadow ?? true; + mesh_ring_engraving_middle_41.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_middle_41.userData.explodeWithParent = "ring"; + node_ring_engraving_middle_41.add(mesh_ring_engraving_middle_41); + meshes["ring-engraving-middle"] = mesh_ring_engraving_middle_41; + colliders["ring-engraving-middle"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_middle_41); + + const attachment_ring_engraving_inner_42 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_inner_42 = makeAttachmentEndpoint(attachment_ring_engraving_inner_42); + const node_ring_engraving_inner_42 = new THREE.Group(); + node_ring_engraving_inner_42.name = "Ring engraving inner__pivot"; + node_ring_engraving_inner_42.scale.set(1, 1, 1); + if (endpoint_ring_engraving_inner_42) { + node_ring_engraving_inner_42.position.copy(endpoint_ring_engraving_inner_42.start); + node_ring_engraving_inner_42.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_inner_42.position.set(0.0, 0.0, 0.0); + node_ring_engraving_inner_42.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_inner_42.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_inner_42.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_inner_42); + nodes["ring-engraving-inner"] = node_ring_engraving_inner_42; + const mesh_ring_engraving_inner_42Geometry = endpoint_ring_engraving_inner_42 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_inner_42.endRadius, endpoint_ring_engraving_inner_42.baseRadius, endpoint_ring_engraving_inner_42.length, 32, 12) + : buildTubeGeometry({"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_inner_42) { + mesh_ring_engraving_inner_42Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_inner_42 = new THREE.Mesh( + mesh_ring_engraving_inner_42Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_inner_42.name = "Ring engraving inner"; + if (endpoint_ring_engraving_inner_42) { + mesh_ring_engraving_inner_42.position.copy(endpoint_ring_engraving_inner_42.midpoint); + mesh_ring_engraving_inner_42.quaternion.copy(endpoint_ring_engraving_inner_42.quaternion); + } + mesh_ring_engraving_inner_42.castShadow = options.castShadow ?? true; + mesh_ring_engraving_inner_42.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_inner_42.userData.explodeWithParent = "ring"; + node_ring_engraving_inner_42.add(mesh_ring_engraving_inner_42); + meshes["ring-engraving-inner"] = mesh_ring_engraving_inner_42; + colliders["ring-engraving-inner"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_inner_42); + + const attachment_ring_engraving_back_outer_43 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_back_outer_43 = makeAttachmentEndpoint(attachment_ring_engraving_back_outer_43); + const node_ring_engraving_back_outer_43 = new THREE.Group(); + node_ring_engraving_back_outer_43.name = "Ring back engraving outer__pivot"; + node_ring_engraving_back_outer_43.scale.set(1, 1, 1); + if (endpoint_ring_engraving_back_outer_43) { + node_ring_engraving_back_outer_43.position.copy(endpoint_ring_engraving_back_outer_43.start); + node_ring_engraving_back_outer_43.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_back_outer_43.position.set(0.0, 0.0, 0.0); + node_ring_engraving_back_outer_43.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_outer_43.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_back_outer_43.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_back_outer_43); + nodes["ring-engraving-back-outer"] = node_ring_engraving_back_outer_43; + const mesh_ring_engraving_back_outer_43Geometry = endpoint_ring_engraving_back_outer_43 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_outer_43.endRadius, endpoint_ring_engraving_back_outer_43.baseRadius, endpoint_ring_engraving_back_outer_43.length, 32, 12) + : buildTubeGeometry({"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_back_outer_43) { + mesh_ring_engraving_back_outer_43Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_back_outer_43 = new THREE.Mesh( + mesh_ring_engraving_back_outer_43Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_back_outer_43.name = "Ring back engraving outer"; + if (endpoint_ring_engraving_back_outer_43) { + mesh_ring_engraving_back_outer_43.position.copy(endpoint_ring_engraving_back_outer_43.midpoint); + mesh_ring_engraving_back_outer_43.quaternion.copy(endpoint_ring_engraving_back_outer_43.quaternion); + } + mesh_ring_engraving_back_outer_43.castShadow = options.castShadow ?? true; + mesh_ring_engraving_back_outer_43.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_outer_43.userData.explodeWithParent = "ring"; + node_ring_engraving_back_outer_43.add(mesh_ring_engraving_back_outer_43); + meshes["ring-engraving-back-outer"] = mesh_ring_engraving_back_outer_43; + colliders["ring-engraving-back-outer"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_back_outer_43); + + const attachment_ring_engraving_back_middle_44 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_back_middle_44 = makeAttachmentEndpoint(attachment_ring_engraving_back_middle_44); + const node_ring_engraving_back_middle_44 = new THREE.Group(); + node_ring_engraving_back_middle_44.name = "Ring back engraving middle__pivot"; + node_ring_engraving_back_middle_44.scale.set(1, 1, 1); + if (endpoint_ring_engraving_back_middle_44) { + node_ring_engraving_back_middle_44.position.copy(endpoint_ring_engraving_back_middle_44.start); + node_ring_engraving_back_middle_44.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_back_middle_44.position.set(0.0, 0.0, 0.0); + node_ring_engraving_back_middle_44.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_middle_44.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_back_middle_44.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_back_middle_44); + nodes["ring-engraving-back-middle"] = node_ring_engraving_back_middle_44; + const mesh_ring_engraving_back_middle_44Geometry = endpoint_ring_engraving_back_middle_44 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_middle_44.endRadius, endpoint_ring_engraving_back_middle_44.baseRadius, endpoint_ring_engraving_back_middle_44.length, 32, 12) + : buildTubeGeometry({"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_back_middle_44) { + mesh_ring_engraving_back_middle_44Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_back_middle_44 = new THREE.Mesh( + mesh_ring_engraving_back_middle_44Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_back_middle_44.name = "Ring back engraving middle"; + if (endpoint_ring_engraving_back_middle_44) { + mesh_ring_engraving_back_middle_44.position.copy(endpoint_ring_engraving_back_middle_44.midpoint); + mesh_ring_engraving_back_middle_44.quaternion.copy(endpoint_ring_engraving_back_middle_44.quaternion); + } + mesh_ring_engraving_back_middle_44.castShadow = options.castShadow ?? true; + mesh_ring_engraving_back_middle_44.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_middle_44.userData.explodeWithParent = "ring"; + node_ring_engraving_back_middle_44.add(mesh_ring_engraving_back_middle_44); + meshes["ring-engraving-back-middle"] = mesh_ring_engraving_back_middle_44; + colliders["ring-engraving-back-middle"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_back_middle_44); + + const attachment_ring_engraving_back_inner_45 = {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}; + const endpoint_ring_engraving_back_inner_45 = makeAttachmentEndpoint(attachment_ring_engraving_back_inner_45); + const node_ring_engraving_back_inner_45 = new THREE.Group(); + node_ring_engraving_back_inner_45.name = "Ring back engraving inner__pivot"; + node_ring_engraving_back_inner_45.scale.set(1, 1, 1); + if (endpoint_ring_engraving_back_inner_45) { + node_ring_engraving_back_inner_45.position.copy(endpoint_ring_engraving_back_inner_45.start); + node_ring_engraving_back_inner_45.rotation.set(0.0, 0.0, 0.0); + } else { + node_ring_engraving_back_inner_45.position.set(0.0, 0.0, 0.0); + node_ring_engraving_back_inner_45.rotation.set(0.0, 0.0, 0.0); + } + node_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_inner_45.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; + node_ring_engraving_back_inner_45.userData.explodeWithParent = "ring"; + (nodes["root"] ?? root).add(node_ring_engraving_back_inner_45); + nodes["ring-engraving-back-inner"] = node_ring_engraving_back_inner_45; + const mesh_ring_engraving_back_inner_45Geometry = endpoint_ring_engraving_back_inner_45 + ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_inner_45.endRadius, endpoint_ring_engraving_back_inner_45.baseRadius, endpoint_ring_engraving_back_inner_45.length, 32, 12) + : buildTubeGeometry({"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + if (!endpoint_ring_engraving_back_inner_45) { + mesh_ring_engraving_back_inner_45Geometry.scale(1.0, 1.0, 1.0); + } + const mesh_ring_engraving_back_inner_45 = new THREE.Mesh( + mesh_ring_engraving_back_inner_45Geometry, + materialMap["gilt-engraving"] ?? new THREE.MeshStandardMaterial({ color: 0x888888 }) + ); + mesh_ring_engraving_back_inner_45.name = "Ring back engraving inner"; + if (endpoint_ring_engraving_back_inner_45) { + mesh_ring_engraving_back_inner_45.position.copy(endpoint_ring_engraving_back_inner_45.midpoint); + mesh_ring_engraving_back_inner_45.quaternion.copy(endpoint_ring_engraving_back_inner_45.quaternion); + } + mesh_ring_engraving_back_inner_45.castShadow = options.castShadow ?? true; + mesh_ring_engraving_back_inner_45.receiveShadow = options.receiveShadow ?? true; + mesh_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_inner_45.userData.explodeWithParent = "ring"; + node_ring_engraving_back_inner_45.add(mesh_ring_engraving_back_inner_45); + meshes["ring-engraving-back-inner"] = mesh_ring_engraving_back_inner_45; + colliders["ring-engraving-back-inner"] = null; + destructionGroups["ring"] ??= []; + destructionGroups["ring"].push(node_ring_engraving_back_inner_45); + + root.userData.sculptRuntime = { nodes, meshes, sockets, colliders, destructionGroups } satisfies ProceduralModelRuntime; + root.userData.lookDevTargets = {"qualityPriority": "stylized-approximate", "materialPass": {"albedoPaletteRequired": true, "roughnessVariationRequired": true, "normalOrBumpRequired": true, "localOverridesRequired": true, "minimumTextureResolution": 1024, "preferredTextureResolution": 2048, "independentMapChannels": ["albedo", "roughness", "height", "normal", "ambient-occlusion"], "requiredSurfaceFrequencyBands": ["macro", "meso", "micro"], "geometryReliefRequiredWhenSilhouetteAffected": true, "referencePbrExtraction": {"requiredWhenSourceImagePresent": false, "targetThreshold": 0.7, "stopOnLowConfidence": true, "script": "forge/stage1_intake/extract_pbr_evidence.py", "acceptedLimitation": "Source is an illustration plate, not a photographed material. Procedural steel / gilt / wrap is the honest path; extracted maps would copy ink, not PBR."}, "mustAvoid": ["single flat albedo per material", "uniform roughness", "albedo texture reused as roughness/height/normal/AO", "single-frequency random noise", "plastic-looking smooth bark, stone, cloth, foliage, or aged material", "local color/detail described only in prose without material masks", "claiming exact PBR recovery when confidence is below the target threshold"]}, "lightingPass": {"requiredTerms": ["key light", "fill light", "rim or environment light", "exposure", "tone mapping", "background", "contact shadow"], "mustAvoid": ["ambient-only lighting", "flat value range", "missing contact shadow", "reference lighting copied without separating material readability"]}, "screenshotReview": ["Compare albedo palette and local color zones.", "Compare roughness/normal/bump response under light.", "Compare cavity dirt, edge wear, stains, moss, scratches, or other local masks.", "Compare key/fill/rim structure, exposure, tone mapping, background, and contact shadows.", "Capture a neutral-light render to verify material readability without reference lighting.", "Capture a grazing-light close-up to expose flat normals, uniform roughness, tiling, and plastic highlights.", "Capture a reference-matched render from the same camera framing as the source."]}; + root.userData.performanceBudget = {"qualityPriority": "stylized-approximate", "targetTriangles": 250000, "maxDrawCalls": 160, "textureSize": 2048, "fpsTarget": 30, "optimizationPolicy": "Reach accepted visual fidelity first, then optimize without removing reference-critical geometry or surface layers."}; + root.userData.lodPlan = [{"tier": "near", "distance": 0, "strategy": "full component tree and material layers"}, {"tier": "far", "distance": 30, "strategy": "merge static components and reduce local feature geometry"}]; + root.userData.optimizationPlan = {"policy": "Stay below the authored runtime budgets without removing accepted silhouette, material, or interaction evidence.", "runtimeAudit": ["triangles", "draw-calls", "measured-fps", "unique-geometries", "shared-materials", "texture-memory"], "benchmarkPolicy": "FPS is a hard gate on hardware-accelerated WebGL; SwiftShader or llvmpipe measurements are retained as report-only environment diagnostics.", "repetitionDecisions": [{"family": "handle-inlays", "count": 12, "strategy": "retain-selectable-components", "reason": "Each front/back stud and recessed seat is a named component; shared materials already avoid duplicate texture sets."}, {"family": "hamon-lines", "count": 6, "strategy": "retain-distinct-curves", "reason": "The six front/back curves have distinct paths and cannot share one instance transform."}, {"family": "ring-engravings", "count": 6, "strategy": "retain-distinct-profiles", "reason": "Front/back concentric profiles differ by face and size and remain integral ring details."}], "lodStrategy": {"near": "Full component tree, procedural PBR maps, and interaction metadata.", "far": "At 30 relative units, a host application may hide micro integral details while preserving blade, guard, handle, and ring silhouettes.", "implementation": "Documented host integration contract; no automatic LOD swap in the review viewer because the fixed evidence camera is always near-tier."}}; + root.userData.actionReadiness = { + note: 'Use root.userData.sculptRuntime.nodes for transforms, sockets for attachments, colliders for physics proxies, and destructionGroups for breakable sets.', + }; + // Showcase L1 presentation: slight idle rock about the model centre. Keep amplitude + // small so silhouette identity stays readable; disable via options.animate=false for + // frozen screenshot / review paths. Not part of the fill_spec authority chain. + const animate = options.animate !== false; + const basePosition = root.position.clone(); + const baseRotation = root.rotation.clone(); + root.userData.tick = (_dt: number, elapsed: number): void => { + if (!animate) { + root.position.copy(basePosition); + root.rotation.copy(baseRotation); + return; + } + root.rotation.y = baseRotation.y + Math.sin(elapsed * 0.38) * 0.10; + root.rotation.z = baseRotation.z + Math.sin(elapsed * 0.27) * 0.022; + root.position.y = basePosition.y + Math.sin(elapsed * 0.72) * 0.010; + }; + + return root; +} + +export function createHanHuanShouDaoLookDevLights( + mode: 'neutral' | 'grazing' | 'reference' = 'neutral', +): THREE.Group { + const lights = new THREE.Group(); + lights.name = "Han Huan-Shou Dao look-dev lights"; + const hemi = new THREE.HemisphereLight( + mode === 'reference' ? 0xfff0d6 : 0xf2f4ff, + 0x363b42, + mode === 'grazing' ? 0.28 : mode === 'reference' ? 0.72 : 0.85, + ); + hemi.name = 'lookdev-hemi'; + lights.add(hemi); + const key = new THREE.DirectionalLight( + mode === 'reference' ? 0xffcf8a : 0xfff4e8, + mode === 'grazing' ? 4.2 : mode === 'reference' ? 2.6 : 2.15, + ); + if (mode === 'grazing') key.position.set(7.5, 1.1, 4.0); + else if (mode === 'reference') key.position.set(-4.5, 7.5, 5.0); + else key.position.set(-4.0, 6.0, 5.5); + key.name = 'lookdev-key'; + key.castShadow = true; + key.shadow.mapSize.set(4096, 4096); + key.shadow.bias = -0.00025; + key.shadow.normalBias = 0.018; + key.shadow.radius = 7; + key.shadow.blurSamples = 24; + key.shadow.camera.near = 0.5; + key.shadow.camera.far = 30; + key.shadow.camera.left = -2.6; + key.shadow.camera.right = 2.6; + key.shadow.camera.top = 2.6; + key.shadow.camera.bottom = -2.6; + key.shadow.camera.updateProjectionMatrix(); + lights.add(key); + const fill = new THREE.DirectionalLight(0xa8c4ff, mode === 'grazing' ? 0.12 : 0.42); + fill.name = 'lookdev-fill'; + fill.position.set(4.0, 3.0, 3.5); + lights.add(fill); + const rim = new THREE.DirectionalLight(0xfff1c4, mode === 'grazing' ? 0.28 : 0.85); + rim.name = 'lookdev-rim'; + rim.position.set(0.5, 4.5, -6.0); + lights.add(rim); + lights.userData.reviewMode = mode; + lights.userData.lightingFromPhoto = ["Key: even orthographic plate lighting, slightly above-front, no hard indoor bounce.", "Fill: white page surround, high value, keeps steel from falling to mid-grey.", "Rim / environment: weak studio rim so the disk guard and ring read as volumes.", "Exposure: 1.0; protect steel highlights with ACES filmic tone mapping.", "Background: pure white plate field with no gradient or floor plane.", "Contact shadow: optional; the plate is on white, so review shots may omit the floor."]; + lights.userData.lookDevTargets = {"qualityPriority": "stylized-approximate", "materialPass": {"albedoPaletteRequired": true, "roughnessVariationRequired": true, "normalOrBumpRequired": true, "localOverridesRequired": true, "minimumTextureResolution": 1024, "preferredTextureResolution": 2048, "independentMapChannels": ["albedo", "roughness", "height", "normal", "ambient-occlusion"], "requiredSurfaceFrequencyBands": ["macro", "meso", "micro"], "geometryReliefRequiredWhenSilhouetteAffected": true, "referencePbrExtraction": {"requiredWhenSourceImagePresent": false, "targetThreshold": 0.7, "stopOnLowConfidence": true, "script": "forge/stage1_intake/extract_pbr_evidence.py", "acceptedLimitation": "Source is an illustration plate, not a photographed material. Procedural steel / gilt / wrap is the honest path; extracted maps would copy ink, not PBR."}, "mustAvoid": ["single flat albedo per material", "uniform roughness", "albedo texture reused as roughness/height/normal/AO", "single-frequency random noise", "plastic-looking smooth bark, stone, cloth, foliage, or aged material", "local color/detail described only in prose without material masks", "claiming exact PBR recovery when confidence is below the target threshold"]}, "lightingPass": {"requiredTerms": ["key light", "fill light", "rim or environment light", "exposure", "tone mapping", "background", "contact shadow"], "mustAvoid": ["ambient-only lighting", "flat value range", "missing contact shadow", "reference lighting copied without separating material readability"]}, "screenshotReview": ["Compare albedo palette and local color zones.", "Compare roughness/normal/bump response under light.", "Compare cavity dirt, edge wear, stains, moss, scratches, or other local masks.", "Compare key/fill/rim structure, exposure, tone mapping, background, and contact shadows.", "Capture a neutral-light render to verify material readability without reference lighting.", "Capture a grazing-light close-up to expose flat normals, uniform roughness, tiling, and plastic highlights.", "Capture a reference-matched render from the same camera framing as the source."]}; + return lights; +} + +// PBR materials (clearcoat/iridescence/transmission/anisotropy) need an environment +// map to visually behave as intended — call this once per renderer and assign the +// result to scene.environment before rendering. No external HDR asset required. +export function createHanHuanShouDaoEnvironment(renderer: THREE.WebGLRenderer): THREE.Texture { + const pmrem = new THREE.PMREMGenerator(renderer); + const texture = pmrem.fromScene(new RoomEnvironment(), 0.04).texture; + pmrem.dispose(); + return texture; +} + +// Plan 1.3 §3.2 — auto-framing by bounding box. The Divine Eye can only compare a +// render to the reference if the object is FRAMED consistently (an object framed +// differently scores as wrong even when its shape is right). This positions the camera +// deterministically from the object's bounding box so it fills the frame at a stable +// margin, and sets near/far to the object scale. Call after adding the model to the +// scene, and again on resize (after updating camera.aspect). +export function frameHanHuanShouDaoCamera( + camera: THREE.PerspectiveCamera, + object: THREE.Object3D, + options: { margin?: number; azimuthDeg?: number; elevationDeg?: number } = {}, +): void { + const box = new THREE.Box3().setFromObject(object); + if (box.isEmpty()) return; + const size = box.getSize(new THREE.Vector3()); + const center = box.getCenter(new THREE.Vector3()); + const margin = options.margin ?? 1.15; + const maxDim = Math.max(size.x, size.y, size.z) * margin; + const fov = (camera.fov * Math.PI) / 180; + // distance so the largest object dimension fits vertically in the frame + const distance = (maxDim / 2) / Math.tan(fov / 2); + const az = ((options.azimuthDeg ?? 0) * Math.PI) / 180; + const el = ((options.elevationDeg ?? 0) * Math.PI) / 180; + const dir = new THREE.Vector3( + Math.sin(az) * Math.cos(el), + Math.sin(el), + Math.cos(az) * Math.cos(el), + ); + camera.position.copy(center).addScaledVector(dir, distance); + camera.near = Math.max(0.01, distance - maxDim); + camera.far = distance + maxDim * 2; + camera.lookAt(center); + camera.updateProjectionMatrix(); +} + +// Plan 1.3 §3.2c — PRESENTATION composer (DOF + bloom). CRITICAL (R-POSTFX): this is +// for the showcase/hero render ONLY. The Divine Eye's EVALUATION render MUST use a +// plain renderer with NO composer — bloom blows highlights and DOF blurs edges, which +// would corrupt the deterministic IoU/DCD/edge/blowout signals. Enable dof/bloom ONLY +// when the reference photo actually exhibits them (detect_reference_effects.py authorizes). +export function createHanHuanShouDaoPresentationComposer( + renderer: THREE.WebGLRenderer, + scene: THREE.Scene, + camera: THREE.Camera, + options: { dof?: boolean; bloom?: boolean; bloomStrength?: number; dofFocus?: number; dofAperture?: number } = {}, +): EffectComposer { + const composer = new EffectComposer(renderer); + composer.addPass(new RenderPass(scene, camera)); + if (options.dof) { + composer.addPass(new BokehPass(scene, camera, { + focus: options.dofFocus ?? 10.0, + aperture: options.dofAperture ?? 0.0002, + maxblur: 0.01, + })); + } + if (options.bloom) { + const size = new THREE.Vector2(); + renderer.getSize(size); + composer.addPass(new UnrealBloomPass(size, options.bloomStrength ?? 0.4, 0.4, 0.85)); + } + return composer; +} + +export function configureHanHuanShouDaoRenderer(renderer: THREE.WebGLRenderer): void { + // Load-bearing for view-dependent finishes (anodized / Doppler): without ACES + sRGB + // the environment reflection reads flat/washed instead of a believable metal response. + renderer.toneMapping = THREE.ACESFilmicToneMapping; + renderer.toneMappingExposure = 1.0; + renderer.outputColorSpace = THREE.SRGBColorSpace; +} + +export function createHanHuanShouDaoInspectControls( + camera: THREE.Camera, + domElement: HTMLElement, +): OrbitControls { + // View-dependent finishes only read correctly once the user orbits — their color + // comes from the environment reflection, not albedo, so free rotation matters here. + const controls = new OrbitControls(camera, domElement); + controls.enableDamping = true; + controls.minDistance = 1.0; + controls.maxDistance = 8.0; + controls.autoRotate = false; + return controls; +} diff --git a/src/demos/registry.ts b/src/demos/registry.ts index af9ed34..6ecb73c 100644 --- a/src/demos/registry.ts +++ b/src/demos/registry.ts @@ -1,4 +1,8 @@ import * as THREE from 'three'; +import { + createHanHuanShouDaoModel, + createHanHuanShouDaoLookDevLights, +} from './han-huan-shou-dao/createHanHuanShouDaoModel'; import type { PinnedCaptureCamera } from '../scene'; import { createM9DopplerModel, @@ -202,6 +206,59 @@ const BASE = import.meta.env.BASE_URL; const REPO = 'https://github.com/img2threejs/img2threejs-showcase/blob/main'; const authored: DemoEntry[] = [ + { + id: 'han-huan-shou-dao', + title: 'Han Huan-Shou Dao (汉代环首刀)', + subjectClass: 'object', + blurb: + 'A code-only procedural Three.js reconstruction of a Han-dynasty huan-shou dao ' + + '(ring-pommel sabre) rebuilt from a three-view illustration plate — not photogrammetry ' + + 'and not a downloaded mesh. Single-edged closed ground-blade, thin disk guard, gilt ' + + 'collars, dark cord-wrapped grip with twelve diamond studs, and an open ring pommel ' + + 'with engraved faces. Live: a gentle idle rock so steel grind and gilt catch the light; ' + + 'six structural modules support the gallery explode view.', + referenceImage: `${BASE}references/han-huan-shou-dao.png`, + referenceKind: 'image', + sourcePath: 'src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts', + sourceUrl: `${REPO}/src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts`, + generatedWith: 'img2threejs v1.5.1 · dao family adapter / han-huan-shou subtype', + prompt: + 'Reconstruct the Han-dynasty huan-shou dao from the supplied three-view illustration as a ' + + 'code-only procedural Three.js object: closed single-edged ground blade, disk guard, ' + + 'gilt front/rear ferrules, cord-wrapped handle with paired diamond inlays, and an open ' + + 'ring pommel with front/back engraving. No imported meshes or art packs.', + author: 'abyssalyanbin', + authorUrl: 'https://github.com/abyssalyanbin', + status: 'final', + updatedAt: '2026-08-29', + // Hero: pan look-at toward the tip so the left 320px panel covers empty canvas, then + // pull in so the sabre occupies ~75–85% of the remaining right display. Capture is + // independent (frameForCapture + captureMargin) and must stay on the white plate. + cameraPosition: [1.52, 0.54, 4.62], + cameraTarget: [0.86, 0.02, 0], + cameraFov: 28, + // White-plate capture was ~10% short of the reference fill at the default 1.12 margin. + // 1.04 lands normalized length within ~5% of reference-face-clean (fill ≈ 0.95). + captureMargin: 1.04, + accent: '#c4a46a', + backgroundGradient: { inner: '#3a3f46', outer: '#16181c' }, + exposure: 1.18, + environmentIntensity: 1.12, + toneMapping: 'aces', + installLights: (scene) => { + scene.add(createHanHuanShouDaoLookDevLights('reference')); + }, + build: (scene) => { + const group = createHanHuanShouDaoModel({ + castShadow: true, + receiveShadow: true, + textureSize: 1024, + animate: true, + }); + scene.add(group); + return group; + }, + }, { id: 'leesin', title: 'Lee Sin \u2014 Game Character', From bf0368d917e9efef7c85d972c74e04818d46f5e8 Mon Sep 17 00:00:00 2001 From: nyb_wsl <1034482587@qq.com> Date: Sun, 30 Aug 2026 00:30:43 +0800 Subject: [PATCH 2/3] fix(demo): align Han dao release model --- .../createHanHuanShouDaoModel.ts | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts b/src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts index 7938895..adb7f8c 100644 --- a/src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts +++ b/src/demos/han-huan-shou-dao/createHanHuanShouDaoModel.ts @@ -16,7 +16,7 @@ export type ProceduralModelOptions = { /** * Showcase presentation only: gentle idle rock so steel/gilt catch travelling light. * Defaults to true in the gallery; set false for frozen capture / review paths. - * Geometry authority remains fill_spec.py — this flag is not a modelling parameter. + * Geometry authority remains fill_spec.py; this flag is not a modelling parameter. */ animate?: boolean; }; @@ -743,12 +743,12 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): const materialMap: Record = {}; materialMap["polished-steel"] = createSculptMaterial( "polished-steel", - {"id": "polished-steel", "name": "Polished blade steel", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#AEB4BA", "color": "#AEB4BA", "albedo": {"dominant": "#AEB4BA", "secondary": ["#747B82", "#C8CDD1"], "samplingNotes": "Cool grey steel from the three-view plate, not the rusted photo."}, "colorVariation": {"palette": ["#747B82", "#AEB4BA", "#C8CDD1"], "pattern": "longitudinal-grind", "amplitude": 0.12, "heightCorrelation": 0.15}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [4.0, 1.0], "anisotropy": 8, "texelDensityIntent": "Keep grind lines running heel-to-tip."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 1.2, "amplitude": 0.12, "role": "broad value along the hamon zone"}, {"id": "meso", "frequency": 8.0, "amplitude": 0.08, "role": "longitudinal grind"}, {"id": "micro", "frequency": 36.0, "amplitude": 0.04, "role": "fine polish grit"}], "roughness": {"base": 0.44, "variation": 0.08, "map": "independent-procedural-field", "localResponse": "slightly higher below the hamon, lower on the polished shinogi"}, "metalness": {"base": 0.84, "variation": 0.05}, "envMapIntensity": 0.68, "vertexColors": true, "vertexToneFinal": true, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.14, "scale": 22.0, "space": "tangent"}, "bump": {"pattern": "longitudinal-grind", "amplitude": 0.002, "scale": 20.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.18, "contactShadowBias": 0.2, "notes": "Keep the blade bright; only darken the guard and wrap contacts."}, "wear": {"edgeWear": 0.16, "scratches": ["faint heel-to-tip grind"], "chips": []}, "dirt": {"amount": 0.04, "cavityBias": 0.2, "color": "#6A6864"}, "patina": {"amount": 0.0, "color": "#AEB4BA", "notes": "Illustrated as clean steel."}, "localOverrides": [{"id": "hamon-band", "region": "wavy band along the edge, distal two-thirds", "albedo": "#D8DCE0", "roughness": 0.34, "notes": "Hamon is drawn, not a geometry bevel. Blockout keeps it as a value/roughness stain.", "evidenceRefs": ["blade-face"]}, {"id": "edge-brightening", "region": "cutting edge", "albedo": "#E8EBEE", "roughness": 0.2, "evidenceRefs": ["blade-face"]}], "shaderNotes": ["Polished steel: high metalness, mid-low roughness. Not rust, not chrome mirror.", "Do not reuse albedo as roughness."], "notes": "Reconstruct the three-view illustration, not the excavated relic photo."}, + {"id": "polished-steel", "name": "Polished blade steel", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#AEB4BA", "color": "#AEB4BA", "albedo": {"dominant": "#AEB4BA", "secondary": ["#747B82", "#C8CDD1"], "samplingNotes": "Cool grey steel from the three-view plate, not the rusted photo."}, "colorVariation": {"palette": ["#747B82", "#AEB4BA", "#C8CDD1"], "pattern": "longitudinal-grind", "amplitude": 0.12, "heightCorrelation": 0.15}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [4.0, 1.0], "anisotropy": 8, "texelDensityIntent": "Keep grind lines running heel-to-tip."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 1.2, "amplitude": 0.12, "role": "broad value along the hamon zone"}, {"id": "meso", "frequency": 8.0, "amplitude": 0.08, "role": "longitudinal grind"}, {"id": "micro", "frequency": 36.0, "amplitude": 0.04, "role": "fine polish grit"}], "roughness": {"base": 0.44, "variation": 0.08, "map": "independent-procedural-field", "localResponse": "slightly higher below the hamon, lower on the polished shinogi"}, "metalness": {"base": 0.82, "variation": 0.06}, "envMapIntensity": 0.45, "vertexColors": true, "vertexToneFinal": true, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.14, "scale": 22.0, "space": "tangent"}, "bump": {"pattern": "longitudinal-grind", "amplitude": 0.002, "scale": 20.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.18, "contactShadowBias": 0.2, "notes": "Keep the blade bright; only darken the guard and wrap contacts."}, "wear": {"edgeWear": 0.16, "scratches": ["faint heel-to-tip grind"], "chips": []}, "dirt": {"amount": 0.04, "cavityBias": 0.2, "color": "#6A6864"}, "patina": {"amount": 0.0, "color": "#AEB4BA", "notes": "Illustrated as clean steel."}, "localOverrides": [{"id": "hamon-band", "region": "wavy band along the edge, distal two-thirds", "albedo": "#D8DCE0", "roughness": 0.34, "notes": "Hamon is drawn, not a geometry bevel. Blockout keeps it as a value/roughness stain.", "evidenceRefs": ["blade-face"]}, {"id": "edge-brightening", "region": "cutting edge", "albedo": "#E8EBEE", "roughness": 0.2, "evidenceRefs": ["blade-face"]}], "shaderNotes": ["Polished steel: high metalness, mid-low roughness. Not rust, not chrome mirror.", "Do not reuse albedo as roughness."], "notes": "Reconstruct the three-view illustration, not the excavated relic photo."}, options ); materialMap["gilt-bronze"] = createSculptMaterial( "gilt-bronze", - {"id": "gilt-bronze", "name": "Gilt bronze fittings", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#C4A46A", "color": "#C4A46A", "albedo": {"dominant": "#C4A46A", "secondary": ["#8A7040", "#E0C890"], "samplingNotes": "Guard, collars, and ring share this yellow-metal family."}, "colorVariation": {"palette": ["#C4A46A", "#8A7040", "#E0C890"], "pattern": "soft-cast-mottle", "amplitude": 0.14, "heightCorrelation": 0.2}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.3, "variation": 0.08, "map": "independent-procedural-field", "localResponse": "duller in engraved recesses on the ring"}, "metalness": {"base": 0.86, "variation": 0.06}, "envMapIntensity": 1.05, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified."}, + {"id": "gilt-bronze", "name": "Gilt bronze fittings", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#C4A46A", "color": "#C4A46A", "albedo": {"dominant": "#C4A46A", "secondary": ["#8A7040", "#E0C890"], "samplingNotes": "Guard, collars, and ring share this yellow-metal family."}, "colorVariation": {"palette": ["#C4A46A", "#8A7040", "#E0C890"], "pattern": "soft-cast-mottle", "amplitude": 0.14, "heightCorrelation": 0.2}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.38, "variation": 0.1, "map": "independent-procedural-field", "localResponse": "duller in engraved recesses on the ring"}, "metalness": {"base": 0.74, "variation": 0.08}, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified."}, options ); materialMap["cord-wrap"] = createSculptMaterial( @@ -773,7 +773,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): ); materialMap["gilt-engraving"] = createSculptMaterial( "gilt-engraving", - {"id": "gilt-engraving", "name": "Dark gilt engraving recess", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#6F5427", "color": "#6F5427", "albedo": {"dominant": "#6F5427", "secondary": ["#4F391A", "#8A7040"], "samplingNotes": "Dark recess tone sampled conceptually from the ring engraving."}, "colorVariation": {"palette": ["#4F391A", "#6F5427", "#8A7040"], "pattern": "engraved-recess", "amplitude": 0.06, "heightCorrelation": 0.0}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.55, "variation": 0.08, "map": "independent-procedural-field"}, "metalness": {"base": 0.86, "variation": 0.06}, "envMapIntensity": 0.25, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified."}, + {"id": "gilt-engraving", "name": "Dark gilt engraving recess", "type": "standard", "shaderModel": "MeshStandardMaterial / PBR approximation", "baseColor": "#6F5427", "color": "#6F5427", "albedo": {"dominant": "#6F5427", "secondary": ["#4F391A", "#8A7040"], "samplingNotes": "Dark recess tone sampled conceptually from the ring engraving."}, "colorVariation": {"palette": ["#4F391A", "#6F5427", "#8A7040"], "pattern": "engraved-recess", "amplitude": 0.06, "heightCorrelation": 0.0}, "textureResolution": 1024, "textureProjection": {"mode": "triplanar", "repeat": [1.0, 1.0], "anisotropy": 4, "texelDensityIntent": "Cast-metal scale on small fittings; do not stretch around the ring."}, "surfaceFrequencyBands": [{"id": "macro", "frequency": 2.0, "amplitude": 0.14, "role": "cast value shift"}, {"id": "meso", "frequency": 10.0, "amplitude": 0.08, "role": "engraving suggestion"}, {"id": "micro", "frequency": 32.0, "amplitude": 0.04, "role": "fine grit"}], "roughness": {"base": 0.55, "variation": 0.08, "map": "independent-procedural-field"}, "metalness": {"base": 0.74, "variation": 0.08}, "normal": {"pattern": "derived-from-independent-height-field", "strength": 0.18, "scale": 10.0, "space": "tangent"}, "bump": {"pattern": "cast-engraving", "amplitude": 0.005, "scale": 10.0}, "displacement": {"pattern": "none", "amplitude": 0.0, "scale": 1.0, "silhouetteAffects": false}, "ambientOcclusion": {"cavityStrength": 0.28, "contactShadowBias": 0.22, "notes": "Darken the ring inner diameter and guard/handle seams."}, "wear": {"edgeWear": 0.18, "scratches": [], "chips": []}, "dirt": {"amount": 0.08, "cavityBias": 0.3, "color": "#5A4030"}, "localOverrides": [{"id": "ring-recess", "region": "inner and engraved face of the ring", "albedo": "#8A7040", "roughness": 0.48, "evidenceRefs": ["pommel-ring"]}], "shaderNotes": ["Yellow metal fittings, not painted plastic.", "Keep hue from shifting blue under ACES."], "notes": "Illustration gilt; alloy is not specified.", "envMapIntensity": 0.25}, options ); @@ -2448,16 +2448,16 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_39.position.set(2.1996544811320757, 0.0, -0.006); node_ring_39.rotation.set(0.0, 0.0, 0.0); } - node_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.158, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.158, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; + node_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49517, 0.22085], [0.48059, 0.30931], [0.45592, 0.37268], [0.42045, 0.42045], [0.37268, 0.45592], [0.30931, 0.48059], [0.22085, 0.49517], [0.0, 0.5], [-0.22085, 0.49517], [-0.30931, 0.48059], [-0.37268, 0.45592], [-0.42045, 0.42045], [-0.45592, 0.37268], [-0.48059, 0.30931], [-0.49517, 0.22085], [-0.5, 0.0], [-0.49517, -0.22085], [-0.48059, -0.30931], [-0.45592, -0.37268], [-0.42045, -0.42045], [-0.37268, -0.45592], [-0.30931, -0.48059], [-0.22085, -0.49517], [-0.0, -0.5], [0.22085, -0.49517], [0.30931, -0.48059], [0.37268, -0.45592], [0.42045, -0.42045], [0.45592, -0.37268], [0.48059, -0.30931], [0.49517, -0.22085]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.42}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.139, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.139, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; node_ring_39.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}; node_ring_39.userData.explodeWithParent = null; (nodes["root"] ?? root).add(node_ring_39); nodes["ring"] = node_ring_39; const mesh_ring_39Geometry = endpoint_ring_39 ? new THREE.CylinderGeometry(endpoint_ring_39.endRadius, endpoint_ring_39.baseRadius, endpoint_ring_39.length, 32, 12) - : buildExtrudeGeometry({"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}); + : buildExtrudeGeometry({"points": [[0.5, 0.0], [0.49517, 0.22085], [0.48059, 0.30931], [0.45592, 0.37268], [0.42045, 0.42045], [0.37268, 0.45592], [0.30931, 0.48059], [0.22085, 0.49517], [0.0, 0.5], [-0.22085, 0.49517], [-0.30931, 0.48059], [-0.37268, 0.45592], [-0.42045, 0.42045], [-0.45592, 0.37268], [-0.48059, 0.30931], [-0.49517, 0.22085], [-0.5, 0.0], [-0.49517, -0.22085], [-0.48059, -0.30931], [-0.45592, -0.37268], [-0.42045, -0.42045], [-0.37268, -0.45592], [-0.30931, -0.48059], [-0.22085, -0.49517], [-0.0, -0.5], [0.22085, -0.49517], [0.30931, -0.48059], [0.37268, -0.45592], [0.42045, -0.42045], [0.45592, -0.37268], [0.48059, -0.30931], [0.49517, -0.22085]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.42}]}); if (!endpoint_ring_39) { - mesh_ring_39Geometry.scale(0.148, 0.158, 0.012); + mesh_ring_39Geometry.scale(0.148, 0.139, 0.012); } const mesh_ring_39 = new THREE.Mesh( mesh_ring_39Geometry, @@ -2470,7 +2470,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_39.castShadow = options.castShadow ?? true; mesh_ring_39.receiveShadow = options.receiveShadow ?? true; - mesh_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49039, 0.09755], [0.46194, 0.19134], [0.41573, 0.27779], [0.35355, 0.35355], [0.27779, 0.41573], [0.19134, 0.46194], [0.09755, 0.49039], [0.0, 0.5], [-0.09755, 0.49039], [-0.19134, 0.46194], [-0.27779, 0.41573], [-0.35355, 0.35355], [-0.41573, 0.27779], [-0.46194, 0.19134], [-0.49039, 0.09755], [-0.5, 0.0], [-0.49039, -0.09755], [-0.46194, -0.19134], [-0.41573, -0.27779], [-0.35355, -0.35355], [-0.27779, -0.41573], [-0.19134, -0.46194], [-0.09755, -0.49039], [-0.0, -0.5], [0.09755, -0.49039], [0.19134, -0.46194], [0.27779, -0.41573], [0.35355, -0.35355], [0.41573, -0.27779], [0.46194, -0.19134], [0.49039, -0.09755]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.262}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.158, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.158, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; + mesh_ring_39.userData.sculptComponent = {"id": "ring", "name": "Huan-shou ring", "level": "macro", "role": "pommel", "importance": 1.0, "confidence": 0.9, "primitive": "extrude", "topologyClass": "assembled-solid", "topologyRationale": "Shallow gilt profile in the blade-face plane; an extruded oval hole preserves the aperture without the inflated look of a torus.", "geometryDescriptor": {"topologyIntent": "Huan-shou ring reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "profile2D": {"points": [[0.5, 0.0], [0.49517, 0.22085], [0.48059, 0.30931], [0.45592, 0.37268], [0.42045, 0.42045], [0.37268, 0.45592], [0.30931, 0.48059], [0.22085, 0.49517], [0.0, 0.5], [-0.22085, 0.49517], [-0.30931, 0.48059], [-0.37268, 0.45592], [-0.42045, 0.42045], [-0.45592, 0.37268], [-0.48059, 0.30931], [-0.49517, 0.22085], [-0.5, 0.0], [-0.49517, -0.22085], [-0.48059, -0.30931], [-0.45592, -0.37268], [-0.42045, -0.42045], [-0.37268, -0.45592], [-0.30931, -0.48059], [-0.22085, -0.49517], [-0.0, -0.5], [0.22085, -0.49517], [0.30931, -0.48059], [0.37268, -0.45592], [0.42045, -0.42045], [0.45592, -0.37268], [0.48059, -0.30931], [0.49517, -0.22085]], "depth": 1.0, "ovalHoles": [{"cx": 0.04, "cy": 0.0, "rx": 0.28, "ry": 0.42}]}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "rear-ferrule-back", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.007, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 0.148, "height": 0.139, "depth": 0.012, "units": "relative", "confidence": 0.9}, "transform": {"position": [2.1996544811320757, 0.0, -0.006], "rotation": [0.0, 0.0, 0.0], "scale": [0.148, 0.139, 0.012]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": {"type": "sphere", "offset": [0, 0, 0], "scale": [1, 1, 1], "isTrigger": false, "notes": "ring bounds"}, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-bronze"}}, "material": "gilt-bronze", "materialLayers": ["gilt-bronze"], "deformations": [], "joints": [], "seams": [], "localFeatures": [{"id": "ring-aperture", "kind": "hole", "notes": "Negative space must remain open in every orbit view."}], "surfaceDetail": {"macroRoughness": 0.4, "microRoughness": 0.5, "bumpAmplitude": 0.005, "normalPattern": "cast-engraving", "displacementPattern": "none", "occlusionPattern": "inner ring and seams", "edgeWearPattern": "brighter gilt on outer rim", "notes": "Gilt fittings from the three-view plate."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(196, 164, 106, 1.0)", "secondaryAlbedo": "rgba(138, 112, 64, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.84}}; mesh_ring_39.userData.explodeWithParent = null; node_ring_39.add(mesh_ring_39); meshes["ring"] = mesh_ring_39; @@ -2490,14 +2490,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_outer_40.position.set(0.0, 0.0, 0.0); node_ring_engraving_outer_40.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01193, 0.0067], [2.26053, 0.0234, 0.0067], [2.25451, 0.03398, 0.0067], [2.24641, 0.04325, 0.0067], [2.23654, 0.05085, 0.0067], [2.22529, 0.0565, 0.0067], [2.21307, 0.05998, 0.0067], [2.20036, 0.06116, 0.0067], [2.18766, 0.05998, 0.0067], [2.17544, 0.0565, 0.0067], [2.16419, 0.05085, 0.0067], [2.15432, 0.04325, 0.0067], [2.14622, 0.03398, 0.0067], [2.1402, 0.0234, 0.0067], [2.1365, 0.01193, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01193, 0.0067], [2.1402, -0.0234, 0.0067], [2.14622, -0.03398, 0.0067], [2.15432, -0.04325, 0.0067], [2.16419, -0.05085, 0.0067], [2.17544, -0.0565, 0.0067], [2.18766, -0.05998, 0.0067], [2.20036, -0.06116, 0.0067], [2.21307, -0.05998, 0.0067], [2.22529, -0.0565, 0.0067], [2.23654, -0.05085, 0.0067], [2.24641, -0.04325, 0.0067], [2.25451, -0.03398, 0.0067], [2.26053, -0.0234, 0.0067], [2.26423, -0.01193, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; node_ring_engraving_outer_40.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_outer_40.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_outer_40); nodes["ring-engraving-outer"] = node_ring_engraving_outer_40; const mesh_ring_engraving_outer_40Geometry = endpoint_ring_engraving_outer_40 ? new THREE.CylinderGeometry(endpoint_ring_engraving_outer_40.endRadius, endpoint_ring_engraving_outer_40.baseRadius, endpoint_ring_engraving_outer_40.length, 32, 12) - : buildTubeGeometry({"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01193, 0.0067], [2.26053, 0.0234, 0.0067], [2.25451, 0.03398, 0.0067], [2.24641, 0.04325, 0.0067], [2.23654, 0.05085, 0.0067], [2.22529, 0.0565, 0.0067], [2.21307, 0.05998, 0.0067], [2.20036, 0.06116, 0.0067], [2.18766, 0.05998, 0.0067], [2.17544, 0.0565, 0.0067], [2.16419, 0.05085, 0.0067], [2.15432, 0.04325, 0.0067], [2.14622, 0.03398, 0.0067], [2.1402, 0.0234, 0.0067], [2.1365, 0.01193, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01193, 0.0067], [2.1402, -0.0234, 0.0067], [2.14622, -0.03398, 0.0067], [2.15432, -0.04325, 0.0067], [2.16419, -0.05085, 0.0067], [2.17544, -0.0565, 0.0067], [2.18766, -0.05998, 0.0067], [2.20036, -0.06116, 0.0067], [2.21307, -0.05998, 0.0067], [2.22529, -0.0565, 0.0067], [2.23654, -0.05085, 0.0067], [2.24641, -0.04325, 0.0067], [2.25451, -0.03398, 0.0067], [2.26053, -0.0234, 0.0067], [2.26423, -0.01193, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_outer_40) { mesh_ring_engraving_outer_40Geometry.scale(1.0, 1.0, 1.0); } @@ -2512,7 +2512,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_outer_40.castShadow = options.castShadow ?? true; mesh_ring_engraving_outer_40.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01356, 0.0067], [2.26053, 0.0266, 0.0067], [2.25451, 0.03862, 0.0067], [2.24641, 0.04916, 0.0067], [2.23654, 0.0578, 0.0067], [2.22529, 0.06423, 0.0067], [2.21307, 0.06818, 0.0067], [2.20036, 0.06952, 0.0067], [2.18766, 0.06818, 0.0067], [2.17544, 0.06423, 0.0067], [2.16419, 0.0578, 0.0067], [2.15432, 0.04916, 0.0067], [2.14622, 0.03862, 0.0067], [2.1402, 0.0266, 0.0067], [2.1365, 0.01356, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01356, 0.0067], [2.1402, -0.0266, 0.0067], [2.14622, -0.03862, 0.0067], [2.15432, -0.04916, 0.0067], [2.16419, -0.0578, 0.0067], [2.17544, -0.06423, 0.0067], [2.18766, -0.06818, 0.0067], [2.20036, -0.06952, 0.0067], [2.21307, -0.06818, 0.0067], [2.22529, -0.06423, 0.0067], [2.23654, -0.0578, 0.0067], [2.24641, -0.04916, 0.0067], [2.25451, -0.03862, 0.0067], [2.26053, -0.0266, 0.0067], [2.26423, -0.01356, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_outer_40.userData.sculptComponent = {"id": "ring-engraving-outer", "name": "Ring engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, 0.0067], [2.26423, 0.01193, 0.0067], [2.26053, 0.0234, 0.0067], [2.25451, 0.03398, 0.0067], [2.24641, 0.04325, 0.0067], [2.23654, 0.05085, 0.0067], [2.22529, 0.0565, 0.0067], [2.21307, 0.05998, 0.0067], [2.20036, 0.06116, 0.0067], [2.18766, 0.05998, 0.0067], [2.17544, 0.0565, 0.0067], [2.16419, 0.05085, 0.0067], [2.15432, 0.04325, 0.0067], [2.14622, 0.03398, 0.0067], [2.1402, 0.0234, 0.0067], [2.1365, 0.01193, 0.0067], [2.13524, 0.0, 0.0067], [2.1365, -0.01193, 0.0067], [2.1402, -0.0234, 0.0067], [2.14622, -0.03398, 0.0067], [2.15432, -0.04325, 0.0067], [2.16419, -0.05085, 0.0067], [2.17544, -0.0565, 0.0067], [2.18766, -0.05998, 0.0067], [2.20036, -0.06116, 0.0067], [2.21307, -0.05998, 0.0067], [2.22529, -0.0565, 0.0067], [2.23654, -0.05085, 0.0067], [2.24641, -0.04325, 0.0067], [2.25451, -0.03398, 0.0067], [2.26053, -0.0234, 0.0067], [2.26423, -0.01193, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; mesh_ring_engraving_outer_40.userData.explodeWithParent = "ring"; node_ring_engraving_outer_40.add(mesh_ring_engraving_outer_40); meshes["ring-engraving-outer"] = mesh_ring_engraving_outer_40; @@ -2532,14 +2532,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_middle_41.position.set(0.0, 0.0, 0.0); node_ring_engraving_middle_41.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.00976, 0.0067], [2.25054, 0.01915, 0.0067], [2.24561, 0.0278, 0.0067], [2.23899, 0.03538, 0.0067], [2.23091, 0.04161, 0.0067], [2.2217, 0.04623, 0.0067], [2.21171, 0.04908, 0.0067], [2.20131, 0.05004, 0.0067], [2.19092, 0.04908, 0.0067], [2.18092, 0.04623, 0.0067], [2.17171, 0.04161, 0.0067], [2.16364, 0.03538, 0.0067], [2.15701, 0.0278, 0.0067], [2.15209, 0.01915, 0.0067], [2.14906, 0.00976, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.00976, 0.0067], [2.15209, -0.01915, 0.0067], [2.15701, -0.0278, 0.0067], [2.16364, -0.03538, 0.0067], [2.17171, -0.04161, 0.0067], [2.18092, -0.04623, 0.0067], [2.19092, -0.04908, 0.0067], [2.20131, -0.05004, 0.0067], [2.21171, -0.04908, 0.0067], [2.2217, -0.04623, 0.0067], [2.23091, -0.04161, 0.0067], [2.23899, -0.03538, 0.0067], [2.24561, -0.0278, 0.0067], [2.25054, -0.01915, 0.0067], [2.25357, -0.00976, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; node_ring_engraving_middle_41.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_middle_41.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_middle_41); nodes["ring-engraving-middle"] = node_ring_engraving_middle_41; const mesh_ring_engraving_middle_41Geometry = endpoint_ring_engraving_middle_41 ? new THREE.CylinderGeometry(endpoint_ring_engraving_middle_41.endRadius, endpoint_ring_engraving_middle_41.baseRadius, endpoint_ring_engraving_middle_41.length, 32, 12) - : buildTubeGeometry({"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.00976, 0.0067], [2.25054, 0.01915, 0.0067], [2.24561, 0.0278, 0.0067], [2.23899, 0.03538, 0.0067], [2.23091, 0.04161, 0.0067], [2.2217, 0.04623, 0.0067], [2.21171, 0.04908, 0.0067], [2.20131, 0.05004, 0.0067], [2.19092, 0.04908, 0.0067], [2.18092, 0.04623, 0.0067], [2.17171, 0.04161, 0.0067], [2.16364, 0.03538, 0.0067], [2.15701, 0.0278, 0.0067], [2.15209, 0.01915, 0.0067], [2.14906, 0.00976, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.00976, 0.0067], [2.15209, -0.01915, 0.0067], [2.15701, -0.0278, 0.0067], [2.16364, -0.03538, 0.0067], [2.17171, -0.04161, 0.0067], [2.18092, -0.04623, 0.0067], [2.19092, -0.04908, 0.0067], [2.20131, -0.05004, 0.0067], [2.21171, -0.04908, 0.0067], [2.2217, -0.04623, 0.0067], [2.23091, -0.04161, 0.0067], [2.23899, -0.03538, 0.0067], [2.24561, -0.0278, 0.0067], [2.25054, -0.01915, 0.0067], [2.25357, -0.00976, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_middle_41) { mesh_ring_engraving_middle_41Geometry.scale(1.0, 1.0, 1.0); } @@ -2554,7 +2554,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_middle_41.castShadow = options.castShadow ?? true; mesh_ring_engraving_middle_41.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.0111, 0.0067], [2.25054, 0.02177, 0.0067], [2.24561, 0.0316, 0.0067], [2.23899, 0.04022, 0.0067], [2.23091, 0.04729, 0.0067], [2.2217, 0.05255, 0.0067], [2.21171, 0.05579, 0.0067], [2.20131, 0.05688, 0.0067], [2.19092, 0.05579, 0.0067], [2.18092, 0.05255, 0.0067], [2.17171, 0.04729, 0.0067], [2.16364, 0.04022, 0.0067], [2.15701, 0.0316, 0.0067], [2.15209, 0.02177, 0.0067], [2.14906, 0.0111, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.0111, 0.0067], [2.15209, -0.02177, 0.0067], [2.15701, -0.0316, 0.0067], [2.16364, -0.04022, 0.0067], [2.17171, -0.04729, 0.0067], [2.18092, -0.05255, 0.0067], [2.19092, -0.05579, 0.0067], [2.20131, -0.05688, 0.0067], [2.21171, -0.05579, 0.0067], [2.2217, -0.05255, 0.0067], [2.23091, -0.04729, 0.0067], [2.23899, -0.04022, 0.0067], [2.24561, -0.0316, 0.0067], [2.25054, -0.02177, 0.0067], [2.25357, -0.0111, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_middle_41.userData.sculptComponent = {"id": "ring-engraving-middle", "name": "Ring engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, 0.0067], [2.25357, 0.00976, 0.0067], [2.25054, 0.01915, 0.0067], [2.24561, 0.0278, 0.0067], [2.23899, 0.03538, 0.0067], [2.23091, 0.04161, 0.0067], [2.2217, 0.04623, 0.0067], [2.21171, 0.04908, 0.0067], [2.20131, 0.05004, 0.0067], [2.19092, 0.04908, 0.0067], [2.18092, 0.04623, 0.0067], [2.17171, 0.04161, 0.0067], [2.16364, 0.03538, 0.0067], [2.15701, 0.0278, 0.0067], [2.15209, 0.01915, 0.0067], [2.14906, 0.00976, 0.0067], [2.14803, 0.0, 0.0067], [2.14906, -0.00976, 0.0067], [2.15209, -0.01915, 0.0067], [2.15701, -0.0278, 0.0067], [2.16364, -0.03538, 0.0067], [2.17171, -0.04161, 0.0067], [2.18092, -0.04623, 0.0067], [2.19092, -0.04908, 0.0067], [2.20131, -0.05004, 0.0067], [2.21171, -0.04908, 0.0067], [2.2217, -0.04623, 0.0067], [2.23091, -0.04161, 0.0067], [2.23899, -0.03538, 0.0067], [2.24561, -0.0278, 0.0067], [2.25054, -0.01915, 0.0067], [2.25357, -0.00976, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; mesh_ring_engraving_middle_41.userData.explodeWithParent = "ring"; node_ring_engraving_middle_41.add(mesh_ring_engraving_middle_41); meshes["ring-engraving-middle"] = mesh_ring_engraving_middle_41; @@ -2574,14 +2574,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_inner_42.position.set(0.0, 0.0, 0.0); node_ring_engraving_inner_42.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + node_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00786, 0.0067], [2.24179, 0.01543, 0.0067], [2.23783, 0.0224, 0.0067], [2.23249, 0.0285, 0.0067], [2.22599, 0.03352, 0.0067], [2.21857, 0.03724, 0.0067], [2.21051, 0.03954, 0.0067], [2.20214, 0.04031, 0.0067], [2.19377, 0.03954, 0.0067], [2.18572, 0.03724, 0.0067], [2.1783, 0.03352, 0.0067], [2.17179, 0.0285, 0.0067], [2.16645, 0.0224, 0.0067], [2.16249, 0.01543, 0.0067], [2.16005, 0.00786, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00786, 0.0067], [2.16249, -0.01543, 0.0067], [2.16645, -0.0224, 0.0067], [2.17179, -0.0285, 0.0067], [2.1783, -0.03352, 0.0067], [2.18572, -0.03724, 0.0067], [2.19377, -0.03954, 0.0067], [2.20214, -0.04031, 0.0067], [2.21051, -0.03954, 0.0067], [2.21857, -0.03724, 0.0067], [2.22599, -0.03352, 0.0067], [2.23249, -0.0285, 0.0067], [2.23783, -0.0224, 0.0067], [2.24179, -0.01543, 0.0067], [2.24424, -0.00786, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; node_ring_engraving_inner_42.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_inner_42.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_inner_42); nodes["ring-engraving-inner"] = node_ring_engraving_inner_42; const mesh_ring_engraving_inner_42Geometry = endpoint_ring_engraving_inner_42 ? new THREE.CylinderGeometry(endpoint_ring_engraving_inner_42.endRadius, endpoint_ring_engraving_inner_42.baseRadius, endpoint_ring_engraving_inner_42.length, 32, 12) - : buildTubeGeometry({"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00786, 0.0067], [2.24179, 0.01543, 0.0067], [2.23783, 0.0224, 0.0067], [2.23249, 0.0285, 0.0067], [2.22599, 0.03352, 0.0067], [2.21857, 0.03724, 0.0067], [2.21051, 0.03954, 0.0067], [2.20214, 0.04031, 0.0067], [2.19377, 0.03954, 0.0067], [2.18572, 0.03724, 0.0067], [2.1783, 0.03352, 0.0067], [2.17179, 0.0285, 0.0067], [2.16645, 0.0224, 0.0067], [2.16249, 0.01543, 0.0067], [2.16005, 0.00786, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00786, 0.0067], [2.16249, -0.01543, 0.0067], [2.16645, -0.0224, 0.0067], [2.17179, -0.0285, 0.0067], [2.1783, -0.03352, 0.0067], [2.18572, -0.03724, 0.0067], [2.19377, -0.03954, 0.0067], [2.20214, -0.04031, 0.0067], [2.21051, -0.03954, 0.0067], [2.21857, -0.03724, 0.0067], [2.22599, -0.03352, 0.0067], [2.23249, -0.0285, 0.0067], [2.23783, -0.0224, 0.0067], [2.24179, -0.01543, 0.0067], [2.24424, -0.00786, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_inner_42) { mesh_ring_engraving_inner_42Geometry.scale(1.0, 1.0, 1.0); } @@ -2596,7 +2596,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_inner_42.castShadow = options.castShadow ?? true; mesh_ring_engraving_inner_42.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00894, 0.0067], [2.24179, 0.01753, 0.0067], [2.23783, 0.02546, 0.0067], [2.23249, 0.0324, 0.0067], [2.22599, 0.0381, 0.0067], [2.21857, 0.04233, 0.0067], [2.21051, 0.04494, 0.0067], [2.20214, 0.04582, 0.0067], [2.19377, 0.04494, 0.0067], [2.18572, 0.04233, 0.0067], [2.1783, 0.0381, 0.0067], [2.17179, 0.0324, 0.0067], [2.16645, 0.02546, 0.0067], [2.16249, 0.01753, 0.0067], [2.16005, 0.00894, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00894, 0.0067], [2.16249, -0.01753, 0.0067], [2.16645, -0.02546, 0.0067], [2.17179, -0.0324, 0.0067], [2.1783, -0.0381, 0.0067], [2.18572, -0.04233, 0.0067], [2.19377, -0.04494, 0.0067], [2.20214, -0.04582, 0.0067], [2.21051, -0.04494, 0.0067], [2.21857, -0.04233, 0.0067], [2.22599, -0.0381, 0.0067], [2.23249, -0.0324, 0.0067], [2.23783, -0.02546, 0.0067], [2.24179, -0.01753, 0.0067], [2.24424, -0.00894, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; + mesh_ring_engraving_inner_42.userData.sculptComponent = {"id": "ring-engraving-inner", "name": "Ring engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring front face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, 0.0067], [2.24424, 0.00786, 0.0067], [2.24179, 0.01543, 0.0067], [2.23783, 0.0224, 0.0067], [2.23249, 0.0285, 0.0067], [2.22599, 0.03352, 0.0067], [2.21857, 0.03724, 0.0067], [2.21051, 0.03954, 0.0067], [2.20214, 0.04031, 0.0067], [2.19377, 0.03954, 0.0067], [2.18572, 0.03724, 0.0067], [2.1783, 0.03352, 0.0067], [2.17179, 0.0285, 0.0067], [2.16645, 0.0224, 0.0067], [2.16249, 0.01543, 0.0067], [2.16005, 0.00786, 0.0067], [2.15922, 0.0, 0.0067], [2.16005, -0.00786, 0.0067], [2.16249, -0.01543, 0.0067], [2.16645, -0.0224, 0.0067], [2.17179, -0.0285, 0.0067], [2.1783, -0.03352, 0.0067], [2.18572, -0.03724, 0.0067], [2.19377, -0.03954, 0.0067], [2.20214, -0.04031, 0.0067], [2.21051, -0.03954, 0.0067], [2.21857, -0.03724, 0.0067], [2.22599, -0.03352, 0.0067], [2.23249, -0.0285, 0.0067], [2.23783, -0.0224, 0.0067], [2.24179, -0.01543, 0.0067], [2.24424, -0.00786, 0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "front", "mergePolicy": "bake"}; mesh_ring_engraving_inner_42.userData.explodeWithParent = "ring"; node_ring_engraving_inner_42.add(mesh_ring_engraving_inner_42); meshes["ring-engraving-inner"] = mesh_ring_engraving_inner_42; @@ -2616,14 +2616,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_back_outer_43.position.set(0.0, 0.0, 0.0); node_ring_engraving_back_outer_43.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01193, -0.0067], [2.26053, 0.0234, -0.0067], [2.25451, 0.03398, -0.0067], [2.24641, 0.04325, -0.0067], [2.23654, 0.05085, -0.0067], [2.22529, 0.0565, -0.0067], [2.21307, 0.05998, -0.0067], [2.20036, 0.06116, -0.0067], [2.18766, 0.05998, -0.0067], [2.17544, 0.0565, -0.0067], [2.16419, 0.05085, -0.0067], [2.15432, 0.04325, -0.0067], [2.14622, 0.03398, -0.0067], [2.1402, 0.0234, -0.0067], [2.1365, 0.01193, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01193, -0.0067], [2.1402, -0.0234, -0.0067], [2.14622, -0.03398, -0.0067], [2.15432, -0.04325, -0.0067], [2.16419, -0.05085, -0.0067], [2.17544, -0.0565, -0.0067], [2.18766, -0.05998, -0.0067], [2.20036, -0.06116, -0.0067], [2.21307, -0.05998, -0.0067], [2.22529, -0.0565, -0.0067], [2.23654, -0.05085, -0.0067], [2.24641, -0.04325, -0.0067], [2.25451, -0.03398, -0.0067], [2.26053, -0.0234, -0.0067], [2.26423, -0.01193, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; node_ring_engraving_back_outer_43.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_back_outer_43.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_back_outer_43); nodes["ring-engraving-back-outer"] = node_ring_engraving_back_outer_43; const mesh_ring_engraving_back_outer_43Geometry = endpoint_ring_engraving_back_outer_43 ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_outer_43.endRadius, endpoint_ring_engraving_back_outer_43.baseRadius, endpoint_ring_engraving_back_outer_43.length, 32, 12) - : buildTubeGeometry({"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01193, -0.0067], [2.26053, 0.0234, -0.0067], [2.25451, 0.03398, -0.0067], [2.24641, 0.04325, -0.0067], [2.23654, 0.05085, -0.0067], [2.22529, 0.0565, -0.0067], [2.21307, 0.05998, -0.0067], [2.20036, 0.06116, -0.0067], [2.18766, 0.05998, -0.0067], [2.17544, 0.0565, -0.0067], [2.16419, 0.05085, -0.0067], [2.15432, 0.04325, -0.0067], [2.14622, 0.03398, -0.0067], [2.1402, 0.0234, -0.0067], [2.1365, 0.01193, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01193, -0.0067], [2.1402, -0.0234, -0.0067], [2.14622, -0.03398, -0.0067], [2.15432, -0.04325, -0.0067], [2.16419, -0.05085, -0.0067], [2.17544, -0.0565, -0.0067], [2.18766, -0.05998, -0.0067], [2.20036, -0.06116, -0.0067], [2.21307, -0.05998, -0.0067], [2.22529, -0.0565, -0.0067], [2.23654, -0.05085, -0.0067], [2.24641, -0.04325, -0.0067], [2.25451, -0.03398, -0.0067], [2.26053, -0.0234, -0.0067], [2.26423, -0.01193, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_back_outer_43) { mesh_ring_engraving_back_outer_43Geometry.scale(1.0, 1.0, 1.0); } @@ -2638,7 +2638,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_back_outer_43.castShadow = options.castShadow ?? true; mesh_ring_engraving_back_outer_43.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01356, -0.0067], [2.26053, 0.0266, -0.0067], [2.25451, 0.03862, -0.0067], [2.24641, 0.04916, -0.0067], [2.23654, 0.0578, -0.0067], [2.22529, 0.06423, -0.0067], [2.21307, 0.06818, -0.0067], [2.20036, 0.06952, -0.0067], [2.18766, 0.06818, -0.0067], [2.17544, 0.06423, -0.0067], [2.16419, 0.0578, -0.0067], [2.15432, 0.04916, -0.0067], [2.14622, 0.03862, -0.0067], [2.1402, 0.0266, -0.0067], [2.1365, 0.01356, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01356, -0.0067], [2.1402, -0.0266, -0.0067], [2.14622, -0.03862, -0.0067], [2.15432, -0.04916, -0.0067], [2.16419, -0.0578, -0.0067], [2.17544, -0.06423, -0.0067], [2.18766, -0.06818, -0.0067], [2.20036, -0.06952, -0.0067], [2.21307, -0.06818, -0.0067], [2.22529, -0.06423, -0.0067], [2.23654, -0.0578, -0.0067], [2.24641, -0.04916, -0.0067], [2.25451, -0.03862, -0.0067], [2.26053, -0.0266, -0.0067], [2.26423, -0.01356, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_outer_43.userData.sculptComponent = {"id": "ring-engraving-back-outer", "name": "Ring back engraving outer", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving outer reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.26548, 0.0, -0.0067], [2.26423, 0.01193, -0.0067], [2.26053, 0.0234, -0.0067], [2.25451, 0.03398, -0.0067], [2.24641, 0.04325, -0.0067], [2.23654, 0.05085, -0.0067], [2.22529, 0.0565, -0.0067], [2.21307, 0.05998, -0.0067], [2.20036, 0.06116, -0.0067], [2.18766, 0.05998, -0.0067], [2.17544, 0.0565, -0.0067], [2.16419, 0.05085, -0.0067], [2.15432, 0.04325, -0.0067], [2.14622, 0.03398, -0.0067], [2.1402, 0.0234, -0.0067], [2.1365, 0.01193, -0.0067], [2.13524, 0.0, -0.0067], [2.1365, -0.01193, -0.0067], [2.1402, -0.0234, -0.0067], [2.14622, -0.03398, -0.0067], [2.15432, -0.04325, -0.0067], [2.16419, -0.05085, -0.0067], [2.17544, -0.0565, -0.0067], [2.18766, -0.05998, -0.0067], [2.20036, -0.06116, -0.0067], [2.21307, -0.05998, -0.0067], [2.22529, -0.0565, -0.0067], [2.23654, -0.05085, -0.0067], [2.24641, -0.04325, -0.0067], [2.25451, -0.03398, -0.0067], [2.26053, -0.0234, -0.0067], [2.26423, -0.01193, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; mesh_ring_engraving_back_outer_43.userData.explodeWithParent = "ring"; node_ring_engraving_back_outer_43.add(mesh_ring_engraving_back_outer_43); meshes["ring-engraving-back-outer"] = mesh_ring_engraving_back_outer_43; @@ -2658,14 +2658,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_back_middle_44.position.set(0.0, 0.0, 0.0); node_ring_engraving_back_middle_44.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.00976, -0.0067], [2.25054, 0.01915, -0.0067], [2.24561, 0.0278, -0.0067], [2.23899, 0.03538, -0.0067], [2.23091, 0.04161, -0.0067], [2.2217, 0.04623, -0.0067], [2.21171, 0.04908, -0.0067], [2.20131, 0.05004, -0.0067], [2.19092, 0.04908, -0.0067], [2.18092, 0.04623, -0.0067], [2.17171, 0.04161, -0.0067], [2.16364, 0.03538, -0.0067], [2.15701, 0.0278, -0.0067], [2.15209, 0.01915, -0.0067], [2.14906, 0.00976, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.00976, -0.0067], [2.15209, -0.01915, -0.0067], [2.15701, -0.0278, -0.0067], [2.16364, -0.03538, -0.0067], [2.17171, -0.04161, -0.0067], [2.18092, -0.04623, -0.0067], [2.19092, -0.04908, -0.0067], [2.20131, -0.05004, -0.0067], [2.21171, -0.04908, -0.0067], [2.2217, -0.04623, -0.0067], [2.23091, -0.04161, -0.0067], [2.23899, -0.03538, -0.0067], [2.24561, -0.0278, -0.0067], [2.25054, -0.01915, -0.0067], [2.25357, -0.00976, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; node_ring_engraving_back_middle_44.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_back_middle_44.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_back_middle_44); nodes["ring-engraving-back-middle"] = node_ring_engraving_back_middle_44; const mesh_ring_engraving_back_middle_44Geometry = endpoint_ring_engraving_back_middle_44 ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_middle_44.endRadius, endpoint_ring_engraving_back_middle_44.baseRadius, endpoint_ring_engraving_back_middle_44.length, 32, 12) - : buildTubeGeometry({"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.00976, -0.0067], [2.25054, 0.01915, -0.0067], [2.24561, 0.0278, -0.0067], [2.23899, 0.03538, -0.0067], [2.23091, 0.04161, -0.0067], [2.2217, 0.04623, -0.0067], [2.21171, 0.04908, -0.0067], [2.20131, 0.05004, -0.0067], [2.19092, 0.04908, -0.0067], [2.18092, 0.04623, -0.0067], [2.17171, 0.04161, -0.0067], [2.16364, 0.03538, -0.0067], [2.15701, 0.0278, -0.0067], [2.15209, 0.01915, -0.0067], [2.14906, 0.00976, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.00976, -0.0067], [2.15209, -0.01915, -0.0067], [2.15701, -0.0278, -0.0067], [2.16364, -0.03538, -0.0067], [2.17171, -0.04161, -0.0067], [2.18092, -0.04623, -0.0067], [2.19092, -0.04908, -0.0067], [2.20131, -0.05004, -0.0067], [2.21171, -0.04908, -0.0067], [2.2217, -0.04623, -0.0067], [2.23091, -0.04161, -0.0067], [2.23899, -0.03538, -0.0067], [2.24561, -0.0278, -0.0067], [2.25054, -0.01915, -0.0067], [2.25357, -0.00976, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_back_middle_44) { mesh_ring_engraving_back_middle_44Geometry.scale(1.0, 1.0, 1.0); } @@ -2680,7 +2680,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_back_middle_44.castShadow = options.castShadow ?? true; mesh_ring_engraving_back_middle_44.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.0111, -0.0067], [2.25054, 0.02177, -0.0067], [2.24561, 0.0316, -0.0067], [2.23899, 0.04022, -0.0067], [2.23091, 0.04729, -0.0067], [2.2217, 0.05255, -0.0067], [2.21171, 0.05579, -0.0067], [2.20131, 0.05688, -0.0067], [2.19092, 0.05579, -0.0067], [2.18092, 0.05255, -0.0067], [2.17171, 0.04729, -0.0067], [2.16364, 0.04022, -0.0067], [2.15701, 0.0316, -0.0067], [2.15209, 0.02177, -0.0067], [2.14906, 0.0111, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.0111, -0.0067], [2.15209, -0.02177, -0.0067], [2.15701, -0.0316, -0.0067], [2.16364, -0.04022, -0.0067], [2.17171, -0.04729, -0.0067], [2.18092, -0.05255, -0.0067], [2.19092, -0.05579, -0.0067], [2.20131, -0.05688, -0.0067], [2.21171, -0.05579, -0.0067], [2.2217, -0.05255, -0.0067], [2.23091, -0.04729, -0.0067], [2.23899, -0.04022, -0.0067], [2.24561, -0.0316, -0.0067], [2.25054, -0.02177, -0.0067], [2.25357, -0.0111, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_middle_44.userData.sculptComponent = {"id": "ring-engraving-back-middle", "name": "Ring back engraving middle", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving middle reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.25459, 0.0, -0.0067], [2.25357, 0.00976, -0.0067], [2.25054, 0.01915, -0.0067], [2.24561, 0.0278, -0.0067], [2.23899, 0.03538, -0.0067], [2.23091, 0.04161, -0.0067], [2.2217, 0.04623, -0.0067], [2.21171, 0.04908, -0.0067], [2.20131, 0.05004, -0.0067], [2.19092, 0.04908, -0.0067], [2.18092, 0.04623, -0.0067], [2.17171, 0.04161, -0.0067], [2.16364, 0.03538, -0.0067], [2.15701, 0.0278, -0.0067], [2.15209, 0.01915, -0.0067], [2.14906, 0.00976, -0.0067], [2.14803, 0.0, -0.0067], [2.14906, -0.00976, -0.0067], [2.15209, -0.01915, -0.0067], [2.15701, -0.0278, -0.0067], [2.16364, -0.03538, -0.0067], [2.17171, -0.04161, -0.0067], [2.18092, -0.04623, -0.0067], [2.19092, -0.04908, -0.0067], [2.20131, -0.05004, -0.0067], [2.21171, -0.04908, -0.0067], [2.2217, -0.04623, -0.0067], [2.23091, -0.04161, -0.0067], [2.23899, -0.03538, -0.0067], [2.24561, -0.0278, -0.0067], [2.25054, -0.01915, -0.0067], [2.25357, -0.00976, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; mesh_ring_engraving_back_middle_44.userData.explodeWithParent = "ring"; node_ring_engraving_back_middle_44.add(mesh_ring_engraving_back_middle_44); meshes["ring-engraving-back-middle"] = mesh_ring_engraving_back_middle_44; @@ -2700,14 +2700,14 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): node_ring_engraving_back_inner_45.position.set(0.0, 0.0, 0.0); node_ring_engraving_back_inner_45.rotation.set(0.0, 0.0, 0.0); } - node_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + node_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00786, -0.0067], [2.24179, 0.01543, -0.0067], [2.23783, 0.0224, -0.0067], [2.23249, 0.0285, -0.0067], [2.22599, 0.03352, -0.0067], [2.21857, 0.03724, -0.0067], [2.21051, 0.03954, -0.0067], [2.20214, 0.04031, -0.0067], [2.19377, 0.03954, -0.0067], [2.18572, 0.03724, -0.0067], [2.1783, 0.03352, -0.0067], [2.17179, 0.0285, -0.0067], [2.16645, 0.0224, -0.0067], [2.16249, 0.01543, -0.0067], [2.16005, 0.00786, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00786, -0.0067], [2.16249, -0.01543, -0.0067], [2.16645, -0.0224, -0.0067], [2.17179, -0.0285, -0.0067], [2.1783, -0.03352, -0.0067], [2.18572, -0.03724, -0.0067], [2.19377, -0.03954, -0.0067], [2.20214, -0.04031, -0.0067], [2.21051, -0.03954, -0.0067], [2.21857, -0.03724, -0.0067], [2.22599, -0.03352, -0.0067], [2.23249, -0.0285, -0.0067], [2.23783, -0.0224, -0.0067], [2.24179, -0.01543, -0.0067], [2.24424, -0.00786, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; node_ring_engraving_back_inner_45.userData.actionProfile = {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}; node_ring_engraving_back_inner_45.userData.explodeWithParent = "ring"; (nodes["root"] ?? root).add(node_ring_engraving_back_inner_45); nodes["ring-engraving-back-inner"] = node_ring_engraving_back_inner_45; const mesh_ring_engraving_back_inner_45Geometry = endpoint_ring_engraving_back_inner_45 ? new THREE.CylinderGeometry(endpoint_ring_engraving_back_inner_45.endRadius, endpoint_ring_engraving_back_inner_45.baseRadius, endpoint_ring_engraving_back_inner_45.length, 32, 12) - : buildTubeGeometry({"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); + : buildTubeGeometry({"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00786, -0.0067], [2.24179, 0.01543, -0.0067], [2.23783, 0.0224, -0.0067], [2.23249, 0.0285, -0.0067], [2.22599, 0.03352, -0.0067], [2.21857, 0.03724, -0.0067], [2.21051, 0.03954, -0.0067], [2.20214, 0.04031, -0.0067], [2.19377, 0.03954, -0.0067], [2.18572, 0.03724, -0.0067], [2.1783, 0.03352, -0.0067], [2.17179, 0.0285, -0.0067], [2.16645, 0.0224, -0.0067], [2.16249, 0.01543, -0.0067], [2.16005, 0.00786, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00786, -0.0067], [2.16249, -0.01543, -0.0067], [2.16645, -0.0224, -0.0067], [2.17179, -0.0285, -0.0067], [2.1783, -0.03352, -0.0067], [2.18572, -0.03724, -0.0067], [2.19377, -0.03954, -0.0067], [2.20214, -0.04031, -0.0067], [2.21051, -0.03954, -0.0067], [2.21857, -0.03724, -0.0067], [2.22599, -0.03352, -0.0067], [2.23249, -0.0285, -0.0067], [2.23783, -0.0224, -0.0067], [2.24179, -0.01543, -0.0067], [2.24424, -0.00786, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}); if (!endpoint_ring_engraving_back_inner_45) { mesh_ring_engraving_back_inner_45Geometry.scale(1.0, 1.0, 1.0); } @@ -2722,7 +2722,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): } mesh_ring_engraving_back_inner_45.castShadow = options.castShadow ?? true; mesh_ring_engraving_back_inner_45.receiveShadow = options.receiveShadow ?? true; - mesh_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00894, -0.0067], [2.24179, 0.01753, -0.0067], [2.23783, 0.02546, -0.0067], [2.23249, 0.0324, -0.0067], [2.22599, 0.0381, -0.0067], [2.21857, 0.04233, -0.0067], [2.21051, 0.04494, -0.0067], [2.20214, 0.04582, -0.0067], [2.19377, 0.04494, -0.0067], [2.18572, 0.04233, -0.0067], [2.1783, 0.0381, -0.0067], [2.17179, 0.0324, -0.0067], [2.16645, 0.02546, -0.0067], [2.16249, 0.01753, -0.0067], [2.16005, 0.00894, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00894, -0.0067], [2.16249, -0.01753, -0.0067], [2.16645, -0.02546, -0.0067], [2.17179, -0.0324, -0.0067], [2.1783, -0.0381, -0.0067], [2.18572, -0.04233, -0.0067], [2.19377, -0.04494, -0.0067], [2.20214, -0.04582, -0.0067], [2.21051, -0.04494, -0.0067], [2.21857, -0.04233, -0.0067], [2.22599, -0.0381, -0.0067], [2.23249, -0.0324, -0.0067], [2.23783, -0.02546, -0.0067], [2.24179, -0.01753, -0.0067], [2.24424, -0.00894, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; + mesh_ring_engraving_back_inner_45.userData.sculptComponent = {"id": "ring-engraving-back-inner", "name": "Ring back engraving inner", "level": "micro", "role": "detail", "importance": 0.68, "confidence": 0.74, "primitive": "tube", "topologyClass": "continuous-sculpt", "topologyRationale": "Closed dark line follows the ring back face as shallow engraved relief.", "geometryDescriptor": {"topologyIntent": "Ring back engraving inner reconstruction", "edgeTreatment": {"type": "none", "bevelRadius": 0.0, "segments": 1}, "deformationStack": [], "uvStrategy": "generated procedural coordinates", "normalStrategy": "vertex normals from generated geometry", "tubePath": {"points": [[2.24506, 0.0, -0.0067], [2.24424, 0.00786, -0.0067], [2.24179, 0.01543, -0.0067], [2.23783, 0.0224, -0.0067], [2.23249, 0.0285, -0.0067], [2.22599, 0.03352, -0.0067], [2.21857, 0.03724, -0.0067], [2.21051, 0.03954, -0.0067], [2.20214, 0.04031, -0.0067], [2.19377, 0.03954, -0.0067], [2.18572, 0.03724, -0.0067], [2.1783, 0.03352, -0.0067], [2.17179, 0.0285, -0.0067], [2.16645, 0.0224, -0.0067], [2.16249, 0.01543, -0.0067], [2.16005, 0.00786, -0.0067], [2.15922, 0.0, -0.0067], [2.16005, -0.00786, -0.0067], [2.16249, -0.01543, -0.0067], [2.16645, -0.0224, -0.0067], [2.17179, -0.0285, -0.0067], [2.1783, -0.03352, -0.0067], [2.18572, -0.03724, -0.0067], [2.19377, -0.03954, -0.0067], [2.20214, -0.04031, -0.0067], [2.21051, -0.03954, -0.0067], [2.21857, -0.03724, -0.0067], [2.22599, -0.03352, -0.0067], [2.23249, -0.0285, -0.0067], [2.23783, -0.0224, -0.0067], [2.24179, -0.01543, -0.0067], [2.24424, -0.00786, -0.0067]], "radius": 0.0011, "radialSegments": 5, "closed": true}}, "parent": "root", "attachment": {"parentId": "root", "parentSocket": "pommel-anchor", "localStart": [0.0, 0.0, 0.0], "localEnd": [0.0, 0.0, 0.0], "contactType": "sleeve", "overlap": 0.001, "gapTolerance": 0.004, "embedDepth": 0.0}, "dimensions": {"width": 1.0, "height": 1.0, "depth": 1.0, "units": "relative", "confidence": 0.74}, "transform": {"position": [0.0, 0.0, 0.0], "rotation": [0.0, 0.0, 0.0], "scale": [1.0, 1.0, 1.0]}, "actionProfile": {"animationRole": "static", "pivot": {"mode": "center", "localPosition": [0, 0, 0], "axis": [0, 1, 0], "confidence": 0.7}, "transformChannels": {"translate": true, "rotate": true, "scale": true, "bend": false, "twist": false, "detach": false, "visibility": true, "materialState": true}, "sockets": [], "collider": null, "constraints": [], "destruction": {"breakable": false, "fractureGroup": "ring", "seamRefs": [], "detachableFragments": [], "breakImpulse": 0.0, "debrisMaterial": "gilt-engraving"}}, "material": "gilt-engraving", "materialLayers": ["gilt-engraving"], "deformations": [], "joints": [], "seams": [], "localFeatures": [], "surfaceDetail": {"macroRoughness": 0.28, "microRoughness": 0.18, "bumpAmplitude": 0.004, "normalPattern": "fine-grind-lines", "displacementPattern": "none", "occlusionPattern": "contact at fittings", "edgeWearPattern": "brighter steel at the cutting edge", "notes": "Orthographic illustration: polished steel, not excavated rust."}, "evidenceRefs": ["pommel-ring"], "details": [], "fidelityTier": "blockout", "colorMaterialRecipe": {"dominantAlbedo": "rgba(111, 84, 39, 1.0)", "secondaryAlbedo": "rgba(79, 57, 26, 1.0)", "materialClass": "metal", "materialClassConfidence": 0.7}, "explodeWithParent": "ring", "ownerModule": "ring", "face": "back", "mergePolicy": "bake"}; mesh_ring_engraving_back_inner_45.userData.explodeWithParent = "ring"; node_ring_engraving_back_inner_45.add(mesh_ring_engraving_back_inner_45); meshes["ring-engraving-back-inner"] = mesh_ring_engraving_back_inner_45; @@ -2738,9 +2738,7 @@ export function createHanHuanShouDaoModel(options: ProceduralModelOptions = {}): root.userData.actionReadiness = { note: 'Use root.userData.sculptRuntime.nodes for transforms, sockets for attachments, colliders for physics proxies, and destructionGroups for breakable sets.', }; - // Showcase L1 presentation: slight idle rock about the model centre. Keep amplitude - // small so silhouette identity stays readable; disable via options.animate=false for - // frozen screenshot / review paths. Not part of the fill_spec authority chain. + // Showcase L1 presentation only. Frozen evidence paths opt out with animate=false. const animate = options.animate !== false; const basePosition = root.position.clone(); const baseRotation = root.rotation.clone(); From e2b64a5bd4d48f34bb3cd71e47a7e685e2f785d4 Mon Sep 17 00:00:00 2001 From: nyb_wsl <1034482587@qq.com> Date: Mon, 31 Aug 2026 17:47:37 +0800 Subject: [PATCH 3/3] fix(ui): show workbench reference with object-fit contain Keep the full source image visible in the portrait reference plate instead of cropping it with cover. Co-Authored-By: Claude --- src/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles.css b/src/styles.css index 80fde50..b006a03 100644 --- a/src/styles.css +++ b/src/styles.css @@ -505,7 +505,7 @@ body.intro-active { overflow: hidden; } display: block; width: 100%; aspect-ratio: 4 / 5; - object-fit: cover; + object-fit: contain; opacity: 0.9; }