@triforge/uv-core 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.
Files changed (53) hide show
  1. package/dist/core/BaseUnwrapper.d.ts +24 -0
  2. package/dist/core/BaseUnwrapper.d.ts.map +1 -0
  3. package/dist/core/BaseUnwrapper.js +16 -0
  4. package/dist/core/BaseUnwrapper.js.map +1 -0
  5. package/dist/index.d.ts +19 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +15 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/operations/AverageIslandScale.d.ts +15 -0
  10. package/dist/operations/AverageIslandScale.d.ts.map +1 -0
  11. package/dist/operations/AverageIslandScale.js +109 -0
  12. package/dist/operations/AverageIslandScale.js.map +1 -0
  13. package/dist/operations/MarkSeams.d.ts +34 -0
  14. package/dist/operations/MarkSeams.d.ts.map +1 -0
  15. package/dist/operations/MarkSeams.js +41 -0
  16. package/dist/operations/MarkSeams.js.map +1 -0
  17. package/dist/operations/PackIslands.d.ts +22 -0
  18. package/dist/operations/PackIslands.d.ts.map +1 -0
  19. package/dist/operations/PackIslands.js +129 -0
  20. package/dist/operations/PackIslands.js.map +1 -0
  21. package/dist/unwrappers/AngleBasedABF.d.ts +30 -0
  22. package/dist/unwrappers/AngleBasedABF.d.ts.map +1 -0
  23. package/dist/unwrappers/AngleBasedABF.js +162 -0
  24. package/dist/unwrappers/AngleBasedABF.js.map +1 -0
  25. package/dist/unwrappers/ConformalLSCM.d.ts +29 -0
  26. package/dist/unwrappers/ConformalLSCM.d.ts.map +1 -0
  27. package/dist/unwrappers/ConformalLSCM.js +165 -0
  28. package/dist/unwrappers/ConformalLSCM.js.map +1 -0
  29. package/dist/unwrappers/CubeProjection.d.ts +22 -0
  30. package/dist/unwrappers/CubeProjection.d.ts.map +1 -0
  31. package/dist/unwrappers/CubeProjection.js +57 -0
  32. package/dist/unwrappers/CubeProjection.js.map +1 -0
  33. package/dist/unwrappers/CylinderProjection.d.ts +25 -0
  34. package/dist/unwrappers/CylinderProjection.d.ts.map +1 -0
  35. package/dist/unwrappers/CylinderProjection.js +50 -0
  36. package/dist/unwrappers/CylinderProjection.js.map +1 -0
  37. package/dist/unwrappers/SmartUVProject.d.ts +30 -0
  38. package/dist/unwrappers/SmartUVProject.d.ts.map +1 -0
  39. package/dist/unwrappers/SmartUVProject.js +212 -0
  40. package/dist/unwrappers/SmartUVProject.js.map +1 -0
  41. package/dist/unwrappers/SphereProjection.d.ts +24 -0
  42. package/dist/unwrappers/SphereProjection.d.ts.map +1 -0
  43. package/dist/unwrappers/SphereProjection.js +40 -0
  44. package/dist/unwrappers/SphereProjection.js.map +1 -0
  45. package/dist/utils/linearSolver.d.ts +19 -0
  46. package/dist/utils/linearSolver.d.ts.map +1 -0
  47. package/dist/utils/linearSolver.js +73 -0
  48. package/dist/utils/linearSolver.js.map +1 -0
  49. package/dist/utils/meshGraph.d.ts +71 -0
  50. package/dist/utils/meshGraph.d.ts.map +1 -0
  51. package/dist/utils/meshGraph.js +315 -0
  52. package/dist/utils/meshGraph.js.map +1 -0
  53. package/package.json +45 -0
@@ -0,0 +1,315 @@
1
+ import { BufferAttribute } from 'three';
2
+ function edgeKey(a, b) {
3
+ return a < b ? `${a}_${b}` : `${b}_${a}`;
4
+ }
5
+ /**
6
+ * Build a MeshGraph from a BufferGeometry.
7
+ * Handles both indexed and non-indexed geometry.
8
+ * For non-indexed geometry, merges vertices at identical positions.
9
+ */
10
+ export function buildMeshGraph(geometry) {
11
+ const posAttr = geometry.getAttribute('position');
12
+ if (!posAttr)
13
+ throw new Error('st-uv-core: geometry has no position attribute.');
14
+ let triangles;
15
+ let positions;
16
+ if (geometry.index) {
17
+ // Indexed geometry — use as-is
18
+ positions = new Float32Array(posAttr.array);
19
+ const idx = geometry.index.array;
20
+ triangles = new Uint32Array(idx.length);
21
+ for (let i = 0; i < idx.length; i++)
22
+ triangles[i] = idx[i];
23
+ }
24
+ else {
25
+ // Non-indexed — weld by position
26
+ const raw = posAttr.array;
27
+ const vertCount = posAttr.count;
28
+ const posMap = new Map();
29
+ const newPos = [];
30
+ const newIdx = [];
31
+ for (let i = 0; i < vertCount; i++) {
32
+ const x = raw[i * 3], y = raw[i * 3 + 1], z = raw[i * 3 + 2];
33
+ // Round to 5 decimal places to merge near-identical vertices
34
+ const key = `${x.toFixed(5)}_${y.toFixed(5)}_${z.toFixed(5)}`;
35
+ let vi = posMap.get(key);
36
+ if (vi === undefined) {
37
+ vi = newPos.length / 3;
38
+ posMap.set(key, vi);
39
+ newPos.push(x, y, z);
40
+ }
41
+ newIdx.push(vi);
42
+ }
43
+ positions = new Float32Array(newPos);
44
+ triangles = new Uint32Array(newIdx);
45
+ }
46
+ const vertexCount = positions.length / 3;
47
+ const triangleCount = triangles.length / 3;
48
+ // Build adjacency structures
49
+ const vertexTriangles = Array.from({ length: vertexCount }, () => []);
50
+ const edgeTriangles = new Map();
51
+ for (let t = 0; t < triangleCount; t++) {
52
+ const i = triangles[t * 3];
53
+ const j = triangles[t * 3 + 1];
54
+ const k = triangles[t * 3 + 2];
55
+ vertexTriangles[i].push(t);
56
+ vertexTriangles[j].push(t);
57
+ vertexTriangles[k].push(t);
58
+ for (const [a, b] of [[i, j], [j, k], [k, i]]) {
59
+ const key = edgeKey(a, b);
60
+ const entry = edgeTriangles.get(key);
61
+ if (entry)
62
+ entry.push(t);
63
+ else
64
+ edgeTriangles.set(key, [t]);
65
+ }
66
+ }
67
+ // Find boundary vertices (edges with only 1 triangle)
68
+ const boundarySet = new Set();
69
+ for (const [key, tris] of edgeTriangles) {
70
+ if (tris.length === 1) {
71
+ const [a, b] = key.split('_').map(Number);
72
+ boundarySet.add(a);
73
+ boundarySet.add(b);
74
+ }
75
+ }
76
+ const boundary = [...boundarySet];
77
+ return { positions, triangles, vertexCount, triangleCount, vertexTriangles, edgeTriangles, boundary, boundarySet };
78
+ }
79
+ /** Get the index of the vertex opposite to edge (a,b) in triangle t. */
80
+ export function oppositeVertex(triangles, t, a, b) {
81
+ const i = triangles[t * 3], j = triangles[t * 3 + 1], k = triangles[t * 3 + 2];
82
+ if (i !== a && i !== b)
83
+ return i;
84
+ if (j !== a && j !== b)
85
+ return j;
86
+ return k;
87
+ }
88
+ /** Cotangent of angle at vertex opp in the triangle opp-a-b. */
89
+ export function cotangentWeight(positions, opp, a, b) {
90
+ const ox = positions[opp * 3], oy = positions[opp * 3 + 1], oz = positions[opp * 3 + 2];
91
+ const ax = positions[a * 3], ay = positions[a * 3 + 1], az = positions[a * 3 + 2];
92
+ const bx = positions[b * 3], by = positions[b * 3 + 1], bz = positions[b * 3 + 2];
93
+ const ux = ax - ox, uy = ay - oy, uz = az - oz;
94
+ const vx = bx - ox, vy = by - oy, vz = bz - oz;
95
+ const dot = ux * vx + uy * vy + uz * vz;
96
+ // cross magnitude
97
+ const cx = uy * vz - uz * vy;
98
+ const cy = uz * vx - ux * vz;
99
+ const cz = ux * vy - uy * vx;
100
+ const crossLen = Math.sqrt(cx * cx + cy * cy + cz * cz);
101
+ if (crossLen < 1e-10)
102
+ return 0;
103
+ return dot / crossLen;
104
+ }
105
+ /** Mean-value weight for edge (i,j) at vertex i — used by ABF. */
106
+ export function meanValueWeight(positions, i, j, opp) {
107
+ const ix = positions[i * 3], iy = positions[i * 3 + 1], iz = positions[i * 3 + 2];
108
+ const jx = positions[j * 3], jy = positions[j * 3 + 1], jz = positions[j * 3 + 2];
109
+ const ox = positions[opp * 3], oy = positions[opp * 3 + 1], oz = positions[opp * 3 + 2];
110
+ // Angle at i in triangle (i, j, opp)
111
+ const ijx = jx - ix, ijy = jy - iy, ijz = jz - iz;
112
+ const iox = ox - ix, ioy = oy - iy, ioz = oz - iz;
113
+ const lenIJ = Math.sqrt(ijx * ijx + ijy * ijy + ijz * ijz);
114
+ const lenIO = Math.sqrt(iox * iox + ioy * ioy + ioz * ioz);
115
+ const cosA = (ijx * iox + ijy * ioy + ijz * ioz) / (lenIJ * lenIO + 1e-10);
116
+ const angle = Math.acos(Math.max(-1, Math.min(1, cosA)));
117
+ return Math.tan(angle / 2) / (lenIJ + 1e-10);
118
+ }
119
+ /**
120
+ * Apply seam cuts to a MeshGraph in-place.
121
+ *
122
+ * For each seam edge (a,b) that has two incident triangles [t0, t1]:
123
+ * - Duplicates vertices a and b as new vertices a' and b'
124
+ * - Rewires triangle t1 to use a' and b' instead of a and b
125
+ * - Removes the shared edge and adds two free boundary edges instead
126
+ * - Updates all adjacency structures (vertexTriangles, edgeTriangles, positions)
127
+ *
128
+ * After all cuts, recomputes boundary / boundarySet so the solver treats the
129
+ * seam edges as open boundaries and assigns independent UV coordinates on each side.
130
+ *
131
+ * Called by ConformalLSCM and AngleBasedABF when geometry.userData.seams is set.
132
+ */
133
+ export function applySeamCuts(graph, seams) {
134
+ if (!seams || seams.length === 0)
135
+ return;
136
+ // Work with growable arrays so we can add vertices
137
+ const posList = Array.from(graph.positions);
138
+ const triList = Array.from(graph.triangles);
139
+ let vertexCount = graph.vertexCount;
140
+ // vertexTriangles is indexed by vertex; grow it as we add vertices
141
+ const vertexTriangles = graph.vertexTriangles.map(arr => [...arr]);
142
+ for (const { a, b } of seams) {
143
+ const key = edgeKey(a, b);
144
+ const entry = graph.edgeTriangles.get(key);
145
+ if (!entry || entry.length !== 2)
146
+ continue; // boundary or non-existent edge
147
+ const [t0, t1] = entry;
148
+ // ── duplicate vertex a → a' ──────────────────────────────────────────────
149
+ const aPrime = vertexCount++;
150
+ posList.push(posList[a * 3], posList[a * 3 + 1], posList[a * 3 + 2]);
151
+ vertexTriangles.push([]); // will be populated below
152
+ // ── duplicate vertex b → b' ──────────────────────────────────────────────
153
+ const bPrime = vertexCount++;
154
+ posList.push(posList[b * 3], posList[b * 3 + 1], posList[b * 3 + 2]);
155
+ vertexTriangles.push([]);
156
+ // ── rewire t1: replace a→aPrime and b→bPrime ─────────────────────────────
157
+ for (let corner = 0; corner < 3; corner++) {
158
+ const idx = t1 * 3 + corner;
159
+ if (triList[idx] === a)
160
+ triList[idx] = aPrime;
161
+ else if (triList[idx] === b)
162
+ triList[idx] = bPrime;
163
+ }
164
+ // ── fix vertexTriangles for a, b, aPrime, bPrime ─────────────────────────
165
+ // Remove t1 from a's and b's triangle lists; add to aPrime and bPrime
166
+ vertexTriangles[a] = vertexTriangles[a].filter(t => t !== t1);
167
+ vertexTriangles[b] = vertexTriangles[b].filter(t => t !== t1);
168
+ vertexTriangles[aPrime].push(t1);
169
+ vertexTriangles[bPrime].push(t1);
170
+ // ── update edgeTriangles ──────────────────────────────────────────────────
171
+ // Remove the shared edge entirely (it no longer exists as a manifold edge)
172
+ graph.edgeTriangles.delete(key);
173
+ // t1 now has new corners; rebuild its edge keys
174
+ const i1 = triList[t1 * 3], j1 = triList[t1 * 3 + 1], k1 = triList[t1 * 3 + 2];
175
+ for (const [ea, eb] of [[i1, j1], [j1, k1], [k1, i1]]) {
176
+ if ((ea === aPrime || ea === bPrime) || (eb === aPrime || eb === bPrime)) {
177
+ // This edge involves the new vertices — register it fresh
178
+ const newKey = edgeKey(ea, eb);
179
+ if (!graph.edgeTriangles.has(newKey)) {
180
+ graph.edgeTriangles.set(newKey, [t1]);
181
+ }
182
+ else {
183
+ const existing = graph.edgeTriangles.get(newKey);
184
+ if (!existing.includes(t1))
185
+ existing.push(t1);
186
+ }
187
+ }
188
+ }
189
+ // t0 keeps the original edge a-b but it's now a boundary (only 1 triangle)
190
+ // Register a boundary entry for t0's a-b edge if not already present
191
+ const t0key = edgeKey(a, b);
192
+ graph.edgeTriangles.set(t0key, [t0]);
193
+ }
194
+ // Commit grown arrays back into graph
195
+ graph.positions = new Float32Array(posList);
196
+ graph.triangles = new Uint32Array(triList);
197
+ graph.vertexCount = vertexCount;
198
+ graph.triangleCount = triList.length / 3;
199
+ graph.vertexTriangles = vertexTriangles;
200
+ graph.hasSeamSplits = true;
201
+ // Recompute boundary
202
+ const boundarySet = new Set();
203
+ for (const [key, tris] of graph.edgeTriangles) {
204
+ if (tris.length === 1) {
205
+ const [va, vb] = key.split('_').map(Number);
206
+ boundarySet.add(va);
207
+ boundarySet.add(vb);
208
+ }
209
+ }
210
+ graph.boundarySet = boundarySet;
211
+ graph.boundary = [...boundarySet];
212
+ }
213
+ /**
214
+ * Order boundary vertices into a closed loop.
215
+ * Returns undefined if boundary is empty or has complex topology.
216
+ */
217
+ export function orderBoundaryLoop(graph) {
218
+ if (graph.boundary.length === 0)
219
+ return undefined;
220
+ // Build boundary edge adjacency
221
+ const boundaryAdj = new Map();
222
+ for (const [key, tris] of graph.edgeTriangles) {
223
+ if (tris.length === 1) {
224
+ const [a, b] = key.split('_').map(Number);
225
+ if (!boundaryAdj.has(a))
226
+ boundaryAdj.set(a, []);
227
+ if (!boundaryAdj.has(b))
228
+ boundaryAdj.set(b, []);
229
+ boundaryAdj.get(a).push(b);
230
+ boundaryAdj.get(b).push(a);
231
+ }
232
+ }
233
+ // Walk the boundary
234
+ const start = graph.boundary[0];
235
+ const loop = [start];
236
+ const visited = new Set([start]);
237
+ let current = start;
238
+ while (true) {
239
+ const neighbors = boundaryAdj.get(current) ?? [];
240
+ const next = neighbors.find(n => !visited.has(n));
241
+ if (next === undefined)
242
+ break;
243
+ loop.push(next);
244
+ visited.add(next);
245
+ current = next;
246
+ }
247
+ return loop;
248
+ }
249
+ /**
250
+ * Copy the UV attribute from uvArray back into a clone of the source geometry.
251
+ * uvArray: Float32Array of length graph.vertexCount * 2
252
+ *
253
+ * Normal case (no seam splits):
254
+ * - Indexed geometry: write UVs per unique vertex index.
255
+ * - Non-indexed geometry: expand UVs back to per-face-vertex layout.
256
+ *
257
+ * Seam-split case (graph.hasSeamSplits === true):
258
+ * The graph has duplicated vertices; graph.triangles maps each triangle corner
259
+ * to a graph vertex index. We de-index the output so that each face-vertex
260
+ * gets its own UV slot, enabling different UVs on each side of the seam.
261
+ */
262
+ export function applyUVsToGeometry(source, uvArray, graph) {
263
+ // ── seam-split path: output de-indexed geometry ───────────────────────────
264
+ if (graph.hasSeamSplits && source.index) {
265
+ // De-index the source geometry so every face-vertex is independent
266
+ const result = source.toNonIndexed();
267
+ const numFaceVerts = graph.triangleCount * 3;
268
+ const uv = new Float32Array(numFaceVerts * 2);
269
+ for (let fc = 0; fc < numFaceVerts; fc++) {
270
+ const graphVI = graph.triangles[fc]; // graph vertex index for this face-corner
271
+ uv[fc * 2] = uvArray[graphVI * 2];
272
+ uv[fc * 2 + 1] = uvArray[graphVI * 2 + 1];
273
+ }
274
+ result.setAttribute('uv', new BufferAttribute(uv, 2));
275
+ return result;
276
+ }
277
+ const result = source.clone();
278
+ if (source.index) {
279
+ // Indexed without seam splits: uvArray has one entry per unique vertex
280
+ const uv = new Float32Array(graph.vertexCount * 2);
281
+ for (let i = 0; i < graph.vertexCount; i++) {
282
+ uv[i * 2] = uvArray[i * 2];
283
+ uv[i * 2 + 1] = uvArray[i * 2 + 1];
284
+ }
285
+ result.setAttribute('uv', new BufferAttribute(uv, 2));
286
+ }
287
+ else {
288
+ // Non-indexed: expand per-welded-vertex UVs to per-face-vertex
289
+ const origCount = source.getAttribute('position').count;
290
+ const uv = new Float32Array(origCount * 2);
291
+ // Rebuild the weld map to know which original vertex → welded vertex
292
+ const posAttr = source.getAttribute('position');
293
+ const raw = posAttr.array;
294
+ const posMap = new Map();
295
+ const weldedIdx = [];
296
+ for (let i = 0; i < origCount; i++) {
297
+ const x = raw[i * 3], y = raw[i * 3 + 1], z = raw[i * 3 + 2];
298
+ const key = `${x.toFixed(5)}_${y.toFixed(5)}_${z.toFixed(5)}`;
299
+ let vi = posMap.get(key);
300
+ if (vi === undefined) {
301
+ vi = posMap.size;
302
+ posMap.set(key, vi);
303
+ }
304
+ weldedIdx.push(vi);
305
+ }
306
+ for (let i = 0; i < origCount; i++) {
307
+ const wi = weldedIdx[i];
308
+ uv[i * 2] = uvArray[wi * 2];
309
+ uv[i * 2 + 1] = uvArray[wi * 2 + 1];
310
+ }
311
+ result.setAttribute('uv', new BufferAttribute(uv, 2));
312
+ }
313
+ return result;
314
+ }
315
+ //# sourceMappingURL=meshGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meshGraph.js","sourceRoot":"","sources":["../../src/utils/meshGraph.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@triforge/uv-core",
3
+ "version": "0.1.0",
4
+ "description": "Blender-matched UV unwrapping algorithms for Three.js BufferGeometry",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "package.json"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "test": "node test/run-tests.js"
16
+ },
17
+ "keywords": [
18
+ "uv",
19
+ "unwrap",
20
+ "texture",
21
+ "three.js",
22
+ "blender",
23
+ "lscm",
24
+ "abf"
25
+ ],
26
+ "license": "MIT",
27
+ "peerDependencies": {
28
+ "three": ">=0.128.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/three": "^0.156.0",
32
+ "three": "^0.156.0",
33
+ "typescript": "^5.3.0"
34
+ },
35
+ "author": "Aftab Ibrahim Kazi",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/AftabIbrahimKazi/triforge.git",
39
+ "directory": "st-uv-core"
40
+ },
41
+ "homepage": "https://github.com/AftabIbrahimKazi/triforge#readme",
42
+ "publishConfig": {
43
+ "access": "public"
44
+ }
45
+ }