@visant/extrude3d 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/glb.js ADDED
@@ -0,0 +1,165 @@
1
+ import * as THREE from 'three';
2
+ import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
3
+ import { parseShapesFromSVG, measureFlatMaxDim } from './geometry.js';
4
+ const DEFAULTS = {
5
+ depth: 0.9,
6
+ smoothness: 0.5,
7
+ bevelEnabled: true,
8
+ bevelThickness: 0.5,
9
+ bevelSize: 0.5,
10
+ color: '#c0c0c0',
11
+ metalness: 0.6,
12
+ roughness: 0.3,
13
+ };
14
+ // ── GLB Builder (no browser APIs, no GLTFExporter) ──────────────────────────
15
+ //
16
+ // Serializes a single indexed mesh + one PBR material into a binary glTF (.glb)
17
+ // by hand. Intentionally dependency-free so it runs in plain Node with no DOM —
18
+ // the server export path relies on this.
19
+ function buildGlb(positions, normals, indices, color, metalness, roughness) {
20
+ const posBytes = new Uint8Array(positions.buffer, positions.byteOffset, positions.byteLength);
21
+ const normBytes = new Uint8Array(normals.buffer, normals.byteOffset, normals.byteLength);
22
+ const idxBytes = new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);
23
+ const binLength = posBytes.length + normBytes.length + idxBytes.length;
24
+ let min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
25
+ for (let i = 0; i < positions.length; i += 3) {
26
+ for (let j = 0; j < 3; j++) {
27
+ if (positions[i + j] < min[j])
28
+ min[j] = positions[i + j];
29
+ if (positions[i + j] > max[j])
30
+ max[j] = positions[i + j];
31
+ }
32
+ }
33
+ const vertexCount = positions.length / 3;
34
+ const posOffset = 0;
35
+ const normOffset = posBytes.length;
36
+ const idxOffset = normOffset + normBytes.length;
37
+ const gltf = {
38
+ asset: { version: '2.0', generator: 'Visant Studio3D Server' },
39
+ scene: 0,
40
+ scenes: [{ nodes: [0] }],
41
+ nodes: [{ mesh: 0, name: 'ExtrudedSVG' }],
42
+ meshes: [{ primitives: [{ attributes: { POSITION: 0, NORMAL: 1 }, indices: 2, material: 0 }] }],
43
+ accessors: [
44
+ { bufferView: 0, componentType: 5126, count: vertexCount, type: 'VEC3', max: max, min: min },
45
+ { bufferView: 1, componentType: 5126, count: vertexCount, type: 'VEC3' },
46
+ { bufferView: 2, componentType: 5125, count: indices.length, type: 'SCALAR' },
47
+ ],
48
+ bufferViews: [
49
+ { buffer: 0, byteOffset: posOffset, byteLength: posBytes.length, target: 34962 },
50
+ { buffer: 0, byteOffset: normOffset, byteLength: normBytes.length, target: 34962 },
51
+ { buffer: 0, byteOffset: idxOffset, byteLength: idxBytes.length, target: 34963 },
52
+ ],
53
+ buffers: [{ byteLength: binLength }],
54
+ materials: [
55
+ {
56
+ pbrMetallicRoughness: {
57
+ baseColorFactor: [...color, 1],
58
+ metallicFactor: metalness,
59
+ roughnessFactor: roughness,
60
+ },
61
+ name: 'material',
62
+ },
63
+ ],
64
+ };
65
+ const jsonStr = JSON.stringify(gltf);
66
+ const jsonPadded = jsonStr + ' '.repeat((4 - (jsonStr.length % 4)) % 4);
67
+ const jsonBuf = new TextEncoder().encode(jsonPadded);
68
+ const binPadded = binLength + ((4 - (binLength % 4)) % 4);
69
+ const binBuf = new Uint8Array(binPadded);
70
+ binBuf.set(posBytes, posOffset);
71
+ binBuf.set(normBytes, normOffset);
72
+ binBuf.set(idxBytes, idxOffset);
73
+ // GLB header: magic(4) + version(4) + length(4) + jsonChunkLen(4) + jsonChunkType(4) + json + binChunkLen(4) + binChunkType(4) + bin
74
+ const totalLength = 12 + 8 + jsonBuf.length + 8 + binBuf.length;
75
+ const glb = new Uint8Array(totalLength);
76
+ const view = new DataView(glb.buffer);
77
+ let off = 0;
78
+ // Header
79
+ view.setUint32(off, 0x46546c67, true);
80
+ off += 4; // 'glTF'
81
+ view.setUint32(off, 2, true);
82
+ off += 4; // version
83
+ view.setUint32(off, totalLength, true);
84
+ off += 4;
85
+ // JSON chunk
86
+ view.setUint32(off, jsonBuf.length, true);
87
+ off += 4;
88
+ view.setUint32(off, 0x4e4f534a, true);
89
+ off += 4; // 'JSON'
90
+ glb.set(jsonBuf, off);
91
+ off += jsonBuf.length;
92
+ // BIN chunk
93
+ view.setUint32(off, binBuf.length, true);
94
+ off += 4;
95
+ view.setUint32(off, 0x004e4942, true);
96
+ off += 4; // 'BIN\0'
97
+ glb.set(binBuf, off);
98
+ return glb;
99
+ }
100
+ /**
101
+ * SVG string → extruded, merged, centered geometry serialized as a binary glTF
102
+ * (`.glb`). This is the pure core of the Studio3D server export
103
+ * (`studio3dExportService.svgToGlb`); the service keeps only the DOMParser/JSDOM
104
+ * environment shim and storage. Geometry math (extrude settings, vertex budget)
105
+ * matches the legacy server path exactly — plain `computeVertexNormals`, no
106
+ * crease smoothing, no bevel clamp.
107
+ *
108
+ * Returns the GLB bytes plus the geometry arrays. Throws if the SVG yields no
109
+ * shapes or the merge fails. Requires a DOM `DOMParser` to be available (the
110
+ * server installs one via JSDOM before calling).
111
+ */
112
+ export function svgToGlb(svgString, opts = {}) {
113
+ const o = { ...DEFAULTS, ...opts };
114
+ const allShapes = parseShapesFromSVG(svgString);
115
+ if (allShapes.length === 0)
116
+ throw new Error('No shapes found in SVG');
117
+ const maxFlatDim = measureFlatMaxDim(allShapes);
118
+ const scaledDepth = (o.depth / 10) * maxFlatDim;
119
+ const bevelScale = Math.min(maxFlatDim * 0.05, 1);
120
+ const idealBevel = Math.round(4 + o.smoothness * 8);
121
+ const idealCurve = Math.round(32 + o.smoothness * 64);
122
+ const budget = 600_000;
123
+ const perShape = Math.max(Math.floor(budget / Math.max(allShapes.length, 1)), 500);
124
+ const est = idealBevel * idealCurve * 6;
125
+ const red = est > perShape ? Math.sqrt(perShape / est) : 1;
126
+ const extrudeSettings = {
127
+ depth: scaledDepth,
128
+ bevelEnabled: o.bevelEnabled,
129
+ bevelThickness: bevelScale * o.bevelThickness,
130
+ bevelSize: bevelScale * o.bevelSize,
131
+ bevelSegments: Math.max(2, Math.min(Math.round(idealBevel * red), 64)),
132
+ curveSegments: Math.max(8, Math.min(Math.round(idealCurve * red), 128)),
133
+ };
134
+ const geometries = allShapes.map((shape) => {
135
+ const geo = new THREE.ExtrudeGeometry(shape, extrudeSettings);
136
+ geo.computeVertexNormals();
137
+ return geo;
138
+ });
139
+ // Merge all geometries
140
+ const merged = BufferGeometryUtils.mergeGeometries(geometries, false);
141
+ geometries.forEach((g) => g.dispose());
142
+ if (!merged)
143
+ throw new Error('Failed to merge geometries');
144
+ // Center
145
+ merged.computeBoundingBox();
146
+ const center = new THREE.Vector3();
147
+ merged.boundingBox.getCenter(center);
148
+ merged.translate(-center.x, -center.y, -center.z);
149
+ // Extract arrays
150
+ const nonIndexed = merged.index ? merged.toNonIndexed() : merged;
151
+ nonIndexed.computeVertexNormals();
152
+ const positions = nonIndexed.attributes.position.array;
153
+ const normals = nonIndexed.attributes.normal.array;
154
+ const vertCount = positions.length / 3;
155
+ const indices = new Uint32Array(vertCount);
156
+ for (let i = 0; i < vertCount; i++)
157
+ indices[i] = i;
158
+ const c = new THREE.Color(o.color);
159
+ const glb = buildGlb(positions, normals, indices, [c.r, c.g, c.b], o.metalness, o.roughness);
160
+ merged.dispose();
161
+ if (nonIndexed !== merged)
162
+ nonIndexed.dispose();
163
+ return { glb, positions, normals, indices };
164
+ }
165
+ //# sourceMappingURL=glb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glb.js","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { BevelOptions, BuildExtrudedGeometryOptions, ExtrudedGeometryResult, OpenTypeFontLike, OpenTypePathLike, OpenTypeGlyphLike, } from './types.js';
2
+ export { buildExtrudedGeometry, buildExtrudeSettings, measureFlatMaxDim, parseShapesFromSVG, smoothCreaseNormals, recomputeTriplanarUVs, isViewBoxRect, type ExtrudeSettings, } from './geometry.js';
3
+ export { materialPresets, MATERIAL_UI, MATERIAL_LIB, resolveMaterial, getSimpleMaterialProps, type MaterialPresetDef, type MaterialUiId, type MaterialCategory, type MaterialUiEntry, type MaterialLibEntry, type ResolvedMaterial, type MaterialOverrides, type SimpleMaterialProps, } from './materials.js';
4
+ export { textToSvg } from './fonts.js';
5
+ export { svgToGlb, type SvgToGlbOptions, type GlbResult } from './glb.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { buildExtrudedGeometry, buildExtrudeSettings, measureFlatMaxDim, parseShapesFromSVG, smoothCreaseNormals, recomputeTriplanarUVs, isViewBoxRect, } from './geometry.js';
2
+ export { materialPresets, MATERIAL_UI, MATERIAL_LIB, resolveMaterial, getSimpleMaterialProps, } from './materials.js';
3
+ export { textToSvg } from './fonts.js';
4
+ export { svgToGlb } from './glb.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,GAEd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,sBAAsB,GASvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAwC,MAAM,UAAU,CAAC"}
@@ -0,0 +1,111 @@
1
+ export interface MaterialPresetDef {
2
+ label: string;
3
+ metalness: number;
4
+ roughness: number;
5
+ opacity: number;
6
+ transparent: boolean;
7
+ emissiveIntensity?: number;
8
+ clearcoat?: number;
9
+ clearcoatRoughness?: number;
10
+ sheen?: number;
11
+ sheenRoughness?: number;
12
+ sheenColor?: string;
13
+ transmission?: number;
14
+ thickness?: number;
15
+ ior?: number;
16
+ iridescence?: number;
17
+ iridescenceIOR?: number;
18
+ reflectivity?: number;
19
+ }
20
+ export declare const materialPresets: Record<string, MaterialPresetDef>;
21
+ export type MaterialUiId = keyof typeof materialPresets;
22
+ export type MaterialCategory = 'basic' | 'metals' | 'surfaces' | 'glass' | 'special';
23
+ export interface MaterialUiEntry {
24
+ id: MaterialUiId;
25
+ category: MaterialCategory;
26
+ /** Swatch / default color applied on selection. Optional. */
27
+ color?: string;
28
+ /** Display label override; defaults to `materialPresets[id].label`. */
29
+ label?: string;
30
+ }
31
+ /**
32
+ * Curated, ordered subset of materials surfaced in the Studio3D UI, grouped by
33
+ * category. Ordering and grouping are intentional and load-bearing for the UI.
34
+ */
35
+ export declare const MATERIAL_UI: MaterialUiEntry[];
36
+ export interface MaterialLibEntry extends MaterialUiEntry {
37
+ label: string;
38
+ }
39
+ /**
40
+ * Fully-resolved UI material list: every entry carries a concrete `label`
41
+ * (override or the PBR-derived default). This is the single list the Studio3D
42
+ * panels iterate over.
43
+ */
44
+ export declare const MATERIAL_LIB: MaterialLibEntry[];
45
+ export interface ResolvedMaterial {
46
+ preset: string;
47
+ metalness: number;
48
+ roughness: number;
49
+ opacity: number;
50
+ transparent: boolean;
51
+ wireframe: boolean;
52
+ emissiveIntensity?: number;
53
+ clearcoat?: number;
54
+ clearcoatRoughness?: number;
55
+ sheen?: number;
56
+ sheenRoughness?: number;
57
+ sheenColor?: string;
58
+ transmission?: number;
59
+ thickness?: number;
60
+ ior?: number;
61
+ iridescence?: number;
62
+ iridescenceIOR?: number;
63
+ reflectivity?: number;
64
+ }
65
+ export interface MaterialOverrides {
66
+ metalness?: number;
67
+ roughness?: number;
68
+ opacity?: number;
69
+ emissiveIntensity?: number;
70
+ wireframe?: boolean;
71
+ clearcoat?: number;
72
+ clearcoatRoughness?: number;
73
+ sheen?: number;
74
+ sheenRoughness?: number;
75
+ sheenColor?: string;
76
+ transmission?: number;
77
+ thickness?: number;
78
+ ior?: number;
79
+ iridescence?: number;
80
+ iridescenceIOR?: number;
81
+ reflectivity?: number;
82
+ }
83
+ export declare function resolveMaterial(preset: string, overrides: MaterialOverrides): ResolvedMaterial;
84
+ /**
85
+ * Flat prop bag for a `<meshPhysicalMaterial>` rendered from a preset + color,
86
+ * with no texture maps, shaders, blend modes, or shape-specific tweaks. This is
87
+ * the "light" material path used by simple consumers (e.g. the Playground 3D
88
+ * scene) that want preset-driven PBR without the full `ExtrudedSVG` pipeline
89
+ * (which is store-coupled and carries texture/fresnel/blend logic).
90
+ *
91
+ * Single source of truth for the preset→material-prop mapping so consumers stop
92
+ * re-deriving it inline. Pure: depends only on `materialPresets` data.
93
+ */
94
+ export interface SimpleMaterialProps {
95
+ color: string;
96
+ metalness: number;
97
+ roughness: number;
98
+ opacity: number;
99
+ transparent: boolean;
100
+ emissiveIntensity: number;
101
+ emissive: string;
102
+ clearcoat: number;
103
+ clearcoatRoughness: number;
104
+ sheen: number;
105
+ sheenRoughness: number;
106
+ transmission: number;
107
+ ior: number;
108
+ iridescence: number;
109
+ }
110
+ export declare function getSimpleMaterialProps(preset: string, color: string): SimpleMaterialProps;
111
+ //# sourceMappingURL=materials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../src/materials.ts"],"names":[],"mappings":"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"}