@meshy-ai/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +8 -2
- package/README.md +342 -108
- package/dist/client/endpoints/animation-catalog.d.ts +37 -0
- package/dist/client/endpoints/animation-catalog.d.ts.map +1 -0
- package/dist/client/endpoints/animation-catalog.js +55 -0
- package/dist/client/endpoints/animation-catalog.js.map +1 -0
- package/dist/client/endpoints/balance.d.ts +5 -0
- package/dist/client/endpoints/balance.d.ts.map +1 -1
- package/dist/client/endpoints/balance.js +5 -1
- package/dist/client/endpoints/balance.js.map +1 -1
- package/dist/client/endpoints/base.d.ts +41 -7
- package/dist/client/endpoints/base.d.ts.map +1 -1
- package/dist/client/endpoints/base.js +61 -40
- package/dist/client/endpoints/base.js.map +1 -1
- package/dist/client/endpoints/showcases.d.ts +31 -0
- package/dist/client/endpoints/showcases.d.ts.map +1 -0
- package/dist/client/endpoints/showcases.js +49 -0
- package/dist/client/endpoints/showcases.js.map +1 -0
- package/dist/client/errors.d.ts +1 -0
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts +47 -38
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +89 -120
- package/dist/client/index.js.map +1 -1
- package/dist/client/resource-registry.d.ts +97 -0
- package/dist/client/resource-registry.d.ts.map +1 -0
- package/dist/client/resource-registry.js +157 -0
- package/dist/client/resource-registry.js.map +1 -0
- package/dist/client/transport.d.ts +99 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +320 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/types.d.ts +17 -6
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +28 -6
- package/dist/client/types.js.map +1 -1
- package/dist/cmd/animation-catalog.d.ts +26 -0
- package/dist/cmd/animation-catalog.d.ts.map +1 -0
- package/dist/cmd/animation-catalog.js +80 -0
- package/dist/cmd/animation-catalog.js.map +1 -0
- package/dist/cmd/api.d.ts +3 -2
- package/dist/cmd/api.d.ts.map +1 -1
- package/dist/cmd/api.js +22 -8
- package/dist/cmd/api.js.map +1 -1
- package/dist/cmd/auth.d.ts.map +1 -1
- package/dist/cmd/auth.js +5 -0
- package/dist/cmd/auth.js.map +1 -1
- package/dist/cmd/balance.d.ts.map +1 -1
- package/dist/cmd/balance.js +10 -6
- package/dist/cmd/balance.js.map +1 -1
- package/dist/cmd/creative-lab.d.ts +26 -0
- package/dist/cmd/creative-lab.d.ts.map +1 -0
- package/dist/cmd/creative-lab.js +256 -0
- package/dist/cmd/creative-lab.js.map +1 -0
- package/dist/cmd/delete.d.ts.map +1 -1
- package/dist/cmd/delete.js +6 -7
- package/dist/cmd/delete.js.map +1 -1
- package/dist/cmd/doctor.d.ts +23 -0
- package/dist/cmd/doctor.d.ts.map +1 -0
- package/dist/cmd/doctor.js +61 -0
- package/dist/cmd/doctor.js.map +1 -0
- package/dist/cmd/download.d.ts +17 -0
- package/dist/cmd/download.d.ts.map +1 -0
- package/dist/cmd/download.js +436 -0
- package/dist/cmd/download.js.map +1 -0
- package/dist/cmd/inspect.d.ts +63 -0
- package/dist/cmd/inspect.d.ts.map +1 -0
- package/dist/cmd/inspect.js +179 -0
- package/dist/cmd/inspect.js.map +1 -0
- package/dist/cmd/make.d.ts +13 -3
- package/dist/cmd/make.d.ts.map +1 -1
- package/dist/cmd/make.js +240 -36
- package/dist/cmd/make.js.map +1 -1
- package/dist/cmd/mesh.d.ts +13 -0
- package/dist/cmd/mesh.d.ts.map +1 -0
- package/dist/cmd/mesh.js +67 -0
- package/dist/cmd/mesh.js.map +1 -0
- package/dist/cmd/project.d.ts +16 -0
- package/dist/cmd/project.d.ts.map +1 -0
- package/dist/cmd/project.js +136 -0
- package/dist/cmd/project.js.map +1 -0
- package/dist/cmd/resources.d.ts +5 -0
- package/dist/cmd/resources.d.ts.map +1 -1
- package/dist/cmd/resources.js +38 -10
- package/dist/cmd/resources.js.map +1 -1
- package/dist/cmd/showcases.d.ts +10 -0
- package/dist/cmd/showcases.d.ts.map +1 -0
- package/dist/cmd/showcases.js +63 -0
- package/dist/cmd/showcases.js.map +1 -0
- package/dist/cmd/slicer.d.ts +12 -0
- package/dist/cmd/slicer.d.ts.map +1 -0
- package/dist/cmd/slicer.js +46 -0
- package/dist/cmd/slicer.js.map +1 -0
- package/dist/cmd/uv-unwrap.d.ts +16 -0
- package/dist/cmd/uv-unwrap.d.ts.map +1 -0
- package/dist/cmd/uv-unwrap.js +52 -0
- package/dist/cmd/uv-unwrap.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -8
- package/dist/index.js.map +1 -1
- package/dist/internal/artifacts.d.ts +97 -0
- package/dist/internal/artifacts.d.ts.map +1 -0
- package/dist/internal/artifacts.js +280 -0
- package/dist/internal/artifacts.js.map +1 -0
- package/dist/internal/atomic-file.d.ts +39 -0
- package/dist/internal/atomic-file.d.ts.map +1 -0
- package/dist/internal/atomic-file.js +160 -0
- package/dist/internal/atomic-file.js.map +1 -0
- package/dist/internal/command-helpers.d.ts +46 -0
- package/dist/internal/command-helpers.d.ts.map +1 -0
- package/dist/internal/command-helpers.js +61 -0
- package/dist/internal/command-helpers.js.map +1 -0
- package/dist/internal/config.d.ts +48 -5
- package/dist/internal/config.d.ts.map +1 -1
- package/dist/internal/config.js +95 -6
- package/dist/internal/config.js.map +1 -1
- package/dist/internal/context.d.ts +25 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +37 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/credentials.d.ts +11 -0
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +2 -0
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/doctor.d.ts +94 -0
- package/dist/internal/doctor.d.ts.map +1 -0
- package/dist/internal/doctor.js +280 -0
- package/dist/internal/doctor.js.map +1 -0
- package/dist/internal/download.d.ts +147 -13
- package/dist/internal/download.d.ts.map +1 -1
- package/dist/internal/download.js +735 -142
- package/dist/internal/download.js.map +1 -1
- package/dist/internal/env-file.d.ts +29 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +95 -0
- package/dist/internal/env-file.js.map +1 -0
- package/dist/internal/errors.d.ts +74 -1
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +173 -1
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/file-input.d.ts +52 -12
- package/dist/internal/file-input.d.ts.map +1 -1
- package/dist/internal/file-input.js +162 -33
- package/dist/internal/file-input.js.map +1 -1
- package/dist/internal/global-options.d.ts +6 -4
- package/dist/internal/global-options.d.ts.map +1 -1
- package/dist/internal/global-options.js +19 -4
- package/dist/internal/global-options.js.map +1 -1
- package/dist/internal/inspect.d.ts +67 -0
- package/dist/internal/inspect.d.ts.map +1 -0
- package/dist/internal/inspect.js +111 -0
- package/dist/internal/inspect.js.map +1 -0
- package/dist/internal/lock.d.ts +19 -0
- package/dist/internal/lock.d.ts.map +1 -0
- package/dist/internal/lock.js +66 -0
- package/dist/internal/lock.js.map +1 -0
- package/dist/internal/material-links.d.ts +115 -0
- package/dist/internal/material-links.d.ts.map +1 -0
- package/dist/internal/material-links.js +577 -0
- package/dist/internal/material-links.js.map +1 -0
- package/dist/internal/obj-transform.d.ts +115 -0
- package/dist/internal/obj-transform.d.ts.map +1 -0
- package/dist/internal/obj-transform.js +649 -0
- package/dist/internal/obj-transform.js.map +1 -0
- package/dist/internal/operation-store.d.ts +123 -0
- package/dist/internal/operation-store.d.ts.map +1 -0
- package/dist/internal/operation-store.js +229 -0
- package/dist/internal/operation-store.js.map +1 -0
- package/dist/internal/output.d.ts +20 -2
- package/dist/internal/output.d.ts.map +1 -1
- package/dist/internal/output.js +32 -4
- package/dist/internal/output.js.map +1 -1
- package/dist/internal/paths.d.ts +89 -0
- package/dist/internal/paths.d.ts.map +1 -0
- package/dist/internal/paths.js +168 -0
- package/dist/internal/paths.js.map +1 -0
- package/dist/internal/payload.d.ts +15 -0
- package/dist/internal/payload.d.ts.map +1 -1
- package/dist/internal/payload.js +50 -3
- package/dist/internal/payload.js.map +1 -1
- package/dist/internal/poll.d.ts +30 -4
- package/dist/internal/poll.d.ts.map +1 -1
- package/dist/internal/poll.js +99 -16
- package/dist/internal/poll.js.map +1 -1
- package/dist/internal/project-store.d.ts +197 -0
- package/dist/internal/project-store.d.ts.map +1 -0
- package/dist/internal/project-store.js +467 -0
- package/dist/internal/project-store.js.map +1 -0
- package/dist/internal/result.d.ts +50 -0
- package/dist/internal/result.d.ts.map +1 -0
- package/dist/internal/result.js +41 -0
- package/dist/internal/result.js.map +1 -0
- package/dist/internal/runtime.d.ts +35 -5
- package/dist/internal/runtime.d.ts.map +1 -1
- package/dist/internal/runtime.js +68 -18
- package/dist/internal/runtime.js.map +1 -1
- package/dist/internal/slicers.d.ts +117 -0
- package/dist/internal/slicers.d.ts.map +1 -0
- package/dist/internal/slicers.js +314 -0
- package/dist/internal/slicers.js.map +1 -0
- package/dist/internal/stream.d.ts +58 -0
- package/dist/internal/stream.d.ts.map +1 -0
- package/dist/internal/stream.js +280 -0
- package/dist/internal/stream.js.map +1 -0
- package/dist/internal/task-command.d.ts +128 -11
- package/dist/internal/task-command.d.ts.map +1 -1
- package/dist/internal/task-command.js +991 -111
- package/dist/internal/task-command.js.map +1 -1
- package/dist/internal/task-view.d.ts +56 -0
- package/dist/internal/task-view.d.ts.map +1 -0
- package/dist/internal/task-view.js +95 -0
- package/dist/internal/task-view.js.map +1 -0
- package/dist/internal/update-notifier.d.ts +5 -1
- package/dist/internal/update-notifier.d.ts.map +1 -1
- package/dist/internal/update-notifier.js +7 -3
- package/dist/internal/update-notifier.js.map +1 -1
- package/dist/root.d.ts +10 -0
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +75 -10
- package/dist/root.js.map +1 -1
- package/package.json +3 -2
- package/skills/meshy-cli/SKILL.md +140 -59
- package/dist/client/endpoints/analyze-printability.d.ts +0 -5
- package/dist/client/endpoints/analyze-printability.d.ts.map +0 -1
- package/dist/client/endpoints/analyze-printability.js +0 -7
- package/dist/client/endpoints/analyze-printability.js.map +0 -1
- package/dist/client/endpoints/animate.d.ts +0 -6
- package/dist/client/endpoints/animate.d.ts.map +0 -1
- package/dist/client/endpoints/animate.js +0 -8
- package/dist/client/endpoints/animate.js.map +0 -1
- package/dist/client/endpoints/convert.d.ts +0 -5
- package/dist/client/endpoints/convert.d.ts.map +0 -1
- package/dist/client/endpoints/convert.js +0 -7
- package/dist/client/endpoints/convert.js.map +0 -1
- package/dist/client/endpoints/image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-3d.js +0 -7
- package/dist/client/endpoints/image-to-3d.js.map +0 -1
- package/dist/client/endpoints/image-to-image.d.ts +0 -5
- package/dist/client/endpoints/image-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-image.js +0 -7
- package/dist/client/endpoints/image-to-image.js.map +0 -1
- package/dist/client/endpoints/multi-color-print.d.ts +0 -5
- package/dist/client/endpoints/multi-color-print.d.ts.map +0 -1
- package/dist/client/endpoints/multi-color-print.js +0 -7
- package/dist/client/endpoints/multi-color-print.js.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/multi-image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.js +0 -7
- package/dist/client/endpoints/multi-image-to-3d.js.map +0 -1
- package/dist/client/endpoints/remesh.d.ts +0 -5
- package/dist/client/endpoints/remesh.d.ts.map +0 -1
- package/dist/client/endpoints/remesh.js +0 -7
- package/dist/client/endpoints/remesh.js.map +0 -1
- package/dist/client/endpoints/repair-printability.d.ts +0 -5
- package/dist/client/endpoints/repair-printability.d.ts.map +0 -1
- package/dist/client/endpoints/repair-printability.js +0 -7
- package/dist/client/endpoints/repair-printability.js.map +0 -1
- package/dist/client/endpoints/resize.d.ts +0 -5
- package/dist/client/endpoints/resize.d.ts.map +0 -1
- package/dist/client/endpoints/resize.js +0 -7
- package/dist/client/endpoints/resize.js.map +0 -1
- package/dist/client/endpoints/retexture.d.ts +0 -5
- package/dist/client/endpoints/retexture.d.ts.map +0 -1
- package/dist/client/endpoints/retexture.js +0 -7
- package/dist/client/endpoints/retexture.js.map +0 -1
- package/dist/client/endpoints/rigging.d.ts +0 -6
- package/dist/client/endpoints/rigging.d.ts.map +0 -1
- package/dist/client/endpoints/rigging.js +0 -8
- package/dist/client/endpoints/rigging.js.map +0 -1
- package/dist/client/endpoints/text-to-3d.d.ts +0 -6
- package/dist/client/endpoints/text-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-3d.js +0 -8
- package/dist/client/endpoints/text-to-3d.js.map +0 -1
- package/dist/client/endpoints/text-to-image.d.ts +0 -5
- package/dist/client/endpoints/text-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-image.js +0 -7
- package/dist/client/endpoints/text-to-image.js.map +0 -1
- package/dist/client/endpoints/text-to-motion.d.ts +0 -6
- package/dist/client/endpoints/text-to-motion.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-motion.js +0 -8
- package/dist/client/endpoints/text-to-motion.js.map +0 -1
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Material relinking for downloaded OBJ sets.
|
|
3
|
+
*
|
|
4
|
+
* Meshy serves an OBJ, its MTL and the textures as separate URLs and the CLI
|
|
5
|
+
* saves them under stable names (model.obj, model.mtl, texture_0_base_color.png
|
|
6
|
+
* …). The OBJ, however, names its MTL the way the server knew it (`mtllib
|
|
7
|
+
* box.mtl`) and the MTL names its textures the same way, so a faithfully
|
|
8
|
+
* downloaded set can still be unloadable. Once every file of a set has landed,
|
|
9
|
+
* this module rewrites those references to the names actually on disk and
|
|
10
|
+
* reports every link it resolved — and every one it could not. Only the two
|
|
11
|
+
* text files the CLI itself just wrote are touched; nothing is renamed, the
|
|
12
|
+
* rewritten paths are listed, and their digests are re-taken by the caller.
|
|
13
|
+
*
|
|
14
|
+
* A texture reference is resolved only when exactly one downloaded texture
|
|
15
|
+
* matches, in this order: the name the server served a texture under (the
|
|
16
|
+
* URL's last segment — `body.png` for `…/body.png`), which is the only evidence
|
|
17
|
+
* of *which* image the MTL meant; a saved file of that name, but only when it
|
|
18
|
+
* is not known to come from a different source (the CLI's generated names
|
|
19
|
+
* `texture_<n>_<channel>` can collide with a server-side name of another
|
|
20
|
+
* texture — that is an ambiguity, not a match); the same name ignoring
|
|
21
|
+
* extension and directories; a channel word inside the referenced name
|
|
22
|
+
* (…_normal.png); the channel implied by the MTL key (map_Kd → base color);
|
|
23
|
+
* finally "the only texture there is" when the MTL has exactly one distinct
|
|
24
|
+
* reference. Several candidates for the same rule is an *ambiguity*: the
|
|
25
|
+
* reference stays as written, the candidates are listed and the report is
|
|
26
|
+
* `incomplete` — the CLI never picks the first of several material groups'
|
|
27
|
+
* textures.
|
|
28
|
+
*
|
|
29
|
+
* The first three rules are *identity* evidence; the channel and only-texture
|
|
30
|
+
* rules are *heuristics*. Resolution therefore runs in two passes over the
|
|
31
|
+
* whole MTL: every distinct reference is resolved on its own first, then the
|
|
32
|
+
* heuristic results are checked against each other — a texture that several
|
|
33
|
+
* different references would fall back to (whichever channel rule each one
|
|
34
|
+
* took to get there, in whichever order they appear) serves none of them, and a
|
|
35
|
+
* reference that different keys would send to different textures is not
|
|
36
|
+
* rewritten either. Two material groups collapsing onto one image without
|
|
37
|
+
* evidence that they name the same file is exactly the guess this module must
|
|
38
|
+
* not make; a reference with identity evidence keeps its texture regardless.
|
|
39
|
+
* Unresolved references are reported the same way. The whole pass is
|
|
40
|
+
* cooperative: an abort signal stops it before the next read, write or
|
|
41
|
+
* publication, leaving no temp file behind.
|
|
42
|
+
*/
|
|
43
|
+
import { createHash } from "node:crypto";
|
|
44
|
+
import { closeSync, createReadStream, createWriteStream, openSync, readFileSync, readSync, statSync, unlinkSync } from "node:fs";
|
|
45
|
+
import { once } from "node:events";
|
|
46
|
+
import { basename } from "node:path";
|
|
47
|
+
import { finished } from "node:stream/promises";
|
|
48
|
+
import { StringDecoder } from "node:string_decoder";
|
|
49
|
+
import { publishTempFile, tempPathFor } from "./atomic-file.js";
|
|
50
|
+
import { CliError } from "./errors.js";
|
|
51
|
+
import { warning } from "./result.js";
|
|
52
|
+
const WS = /\s+/;
|
|
53
|
+
const TEXTURE_KEY_RE = /^(?:map_[A-Za-z0-9_]+|bump|disp|decal|refl|norm)$/i;
|
|
54
|
+
/** MTL files larger than this are not what Meshy produces; leave them alone. */
|
|
55
|
+
const MAX_MTL_BYTES = 16 * 1024 * 1024;
|
|
56
|
+
const CHANNEL_SYNONYMS = {
|
|
57
|
+
basecolor: "basecolor",
|
|
58
|
+
albedo: "basecolor",
|
|
59
|
+
diffuse: "basecolor",
|
|
60
|
+
color: "basecolor",
|
|
61
|
+
colour: "basecolor",
|
|
62
|
+
metallic: "metallic",
|
|
63
|
+
metalness: "metallic",
|
|
64
|
+
metal: "metallic",
|
|
65
|
+
roughness: "roughness",
|
|
66
|
+
rough: "roughness",
|
|
67
|
+
normal: "normal",
|
|
68
|
+
normals: "normal",
|
|
69
|
+
nrm: "normal",
|
|
70
|
+
bump: "normal",
|
|
71
|
+
emissive: "emissive",
|
|
72
|
+
emission: "emissive",
|
|
73
|
+
emit: "emissive",
|
|
74
|
+
occlusion: "occlusion",
|
|
75
|
+
ao: "occlusion",
|
|
76
|
+
ambientocclusion: "occlusion",
|
|
77
|
+
opacity: "opacity",
|
|
78
|
+
alpha: "opacity",
|
|
79
|
+
transparency: "opacity",
|
|
80
|
+
displacement: "displacement",
|
|
81
|
+
height: "displacement",
|
|
82
|
+
disp: "displacement",
|
|
83
|
+
specular: "specular",
|
|
84
|
+
spec: "specular",
|
|
85
|
+
};
|
|
86
|
+
const MAP_KEY_CHANNEL = {
|
|
87
|
+
map_kd: "basecolor",
|
|
88
|
+
map_ka: "basecolor",
|
|
89
|
+
map_pm: "metallic",
|
|
90
|
+
map_pr: "roughness",
|
|
91
|
+
norm: "normal",
|
|
92
|
+
map_bump: "normal",
|
|
93
|
+
bump: "normal",
|
|
94
|
+
map_kn: "normal",
|
|
95
|
+
map_ke: "emissive",
|
|
96
|
+
map_d: "opacity",
|
|
97
|
+
disp: "displacement",
|
|
98
|
+
map_ks: "specular",
|
|
99
|
+
map_ao: "occlusion",
|
|
100
|
+
};
|
|
101
|
+
function canonicalChannel(raw) {
|
|
102
|
+
const compact = raw.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
103
|
+
return CHANNEL_SYNONYMS[compact] ?? null;
|
|
104
|
+
}
|
|
105
|
+
/** Set index and channel encoded in an asset key: `texture.0.base_color` / `texture_0_base_color`. */
|
|
106
|
+
export function describeTextureKey(key) {
|
|
107
|
+
const m = /^texture[._](\d+)[._](.+)$/.exec(key);
|
|
108
|
+
if (!m)
|
|
109
|
+
return { set: null, channel: null };
|
|
110
|
+
return { set: Number(m[1]), channel: canonicalChannel(m[2]) };
|
|
111
|
+
}
|
|
112
|
+
/** @deprecated kept for callers of the round-1 API. */
|
|
113
|
+
export function channelOfTextureKey(key) {
|
|
114
|
+
return describeTextureKey(key).channel;
|
|
115
|
+
}
|
|
116
|
+
/** Channel word inside a referenced file name (`texture_normal.png`, `Body_BaseColor.jpg`). */
|
|
117
|
+
export function channelInFileName(name) {
|
|
118
|
+
const stem = basename(name).replace(/\.[A-Za-z0-9]+$/, "");
|
|
119
|
+
const tokens = stem.split(/[^A-Za-z0-9]+|(?<=[a-z])(?=[A-Z])/).filter(Boolean);
|
|
120
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
121
|
+
const pair = i + 1 < tokens.length ? canonicalChannel(`${tokens[i]}${tokens[i + 1]}`) : null;
|
|
122
|
+
if (pair)
|
|
123
|
+
return pair;
|
|
124
|
+
const single = canonicalChannel(tokens[i]);
|
|
125
|
+
if (single)
|
|
126
|
+
return single;
|
|
127
|
+
}
|
|
128
|
+
const compact = stem.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
129
|
+
for (const word of Object.keys(CHANNEL_SYNONYMS).sort((a, b) => b.length - a.length)) {
|
|
130
|
+
if (word.length >= 5 && compact.includes(word))
|
|
131
|
+
return CHANNEL_SYNONYMS[word];
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
function keywordOf(t) {
|
|
136
|
+
const m = WS.exec(t);
|
|
137
|
+
return m ? t.slice(0, m.index) : t;
|
|
138
|
+
}
|
|
139
|
+
function stemOf(name) {
|
|
140
|
+
return name.replace(/\.[A-Za-z0-9]+$/, "").toLowerCase();
|
|
141
|
+
}
|
|
142
|
+
function looksBinary(path) {
|
|
143
|
+
const fd = openSync(path, "r");
|
|
144
|
+
try {
|
|
145
|
+
const buf = Buffer.alloc(512);
|
|
146
|
+
const n = readSync(fd, buf, 0, 512, 0);
|
|
147
|
+
const head = buf.subarray(0, n);
|
|
148
|
+
if (n >= 2 && head[0] === 0x50 && head[1] === 0x4b)
|
|
149
|
+
return true; // PK: a ZIP bundle, not a text OBJ
|
|
150
|
+
return head.includes(0);
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
closeSync(fd);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** sha256 + size of a file, for manifests that must describe what is actually on disk. */
|
|
157
|
+
export function fileDigest(path) {
|
|
158
|
+
const data = readFileSync(path);
|
|
159
|
+
return { bytes: data.length, sha256: createHash("sha256").update(data).digest("hex") };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Rewrite `path` line by line through a temp file in the same directory. The
|
|
163
|
+
* callback returns the replacement line (without its terminator) or null to
|
|
164
|
+
* keep the line. Returns true when the file was actually replaced.
|
|
165
|
+
*/
|
|
166
|
+
async function rewriteLines(path, transform, signal) {
|
|
167
|
+
if (signal?.aborted)
|
|
168
|
+
throw new CliError({ code: "interrupted", message: `interrupted before ${basename(path)} was rewritten` });
|
|
169
|
+
const tmp = tempPathFor(path);
|
|
170
|
+
const out = createWriteStream(tmp, { flags: "wx" });
|
|
171
|
+
let writeError = null;
|
|
172
|
+
out.on("error", (err) => {
|
|
173
|
+
writeError = err;
|
|
174
|
+
});
|
|
175
|
+
let changed = false;
|
|
176
|
+
let buf = "";
|
|
177
|
+
const flush = async () => {
|
|
178
|
+
if (writeError)
|
|
179
|
+
throw writeError;
|
|
180
|
+
if (buf.length === 0)
|
|
181
|
+
return;
|
|
182
|
+
const chunk = buf;
|
|
183
|
+
buf = "";
|
|
184
|
+
if (!out.write(chunk))
|
|
185
|
+
await once(out, "drain");
|
|
186
|
+
if (writeError)
|
|
187
|
+
throw writeError;
|
|
188
|
+
};
|
|
189
|
+
const decoder = new StringDecoder("utf8");
|
|
190
|
+
let carry = "";
|
|
191
|
+
let lineNo = 0;
|
|
192
|
+
const emitLine = (text, eol) => {
|
|
193
|
+
lineNo += 1;
|
|
194
|
+
const next = transform(text, lineNo);
|
|
195
|
+
if (next !== null && next !== text) {
|
|
196
|
+
changed = true;
|
|
197
|
+
buf += next + eol;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
buf += text + eol;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
try {
|
|
204
|
+
const stream = createReadStream(path, { highWaterMark: 256 * 1024 });
|
|
205
|
+
for await (const chunk of stream) {
|
|
206
|
+
if (signal?.aborted) {
|
|
207
|
+
stream.destroy();
|
|
208
|
+
throw new CliError({ code: "interrupted", message: `interrupted while rewriting ${basename(path)}` });
|
|
209
|
+
}
|
|
210
|
+
carry += decoder.write(chunk);
|
|
211
|
+
let start = 0;
|
|
212
|
+
let nl;
|
|
213
|
+
while ((nl = carry.indexOf("\n", start)) !== -1) {
|
|
214
|
+
let end = nl;
|
|
215
|
+
let eol = "\n";
|
|
216
|
+
if (end > start && carry.charCodeAt(end - 1) === 13) {
|
|
217
|
+
end -= 1;
|
|
218
|
+
eol = "\r\n";
|
|
219
|
+
}
|
|
220
|
+
emitLine(carry.slice(start, end), eol);
|
|
221
|
+
start = nl + 1;
|
|
222
|
+
}
|
|
223
|
+
carry = start > 0 ? carry.slice(start) : carry;
|
|
224
|
+
await flush();
|
|
225
|
+
}
|
|
226
|
+
carry += decoder.end();
|
|
227
|
+
if (carry.length > 0)
|
|
228
|
+
emitLine(carry, "");
|
|
229
|
+
await flush();
|
|
230
|
+
out.end();
|
|
231
|
+
await finished(out);
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
out.destroy();
|
|
235
|
+
try {
|
|
236
|
+
unlinkSync(tmp);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
/* gone */
|
|
240
|
+
}
|
|
241
|
+
if (err instanceof CliError)
|
|
242
|
+
throw err;
|
|
243
|
+
throw new CliError({ code: "local_io", message: `failed to rewrite ${path}: ${err instanceof Error ? err.message : String(err)}`, cause: err });
|
|
244
|
+
}
|
|
245
|
+
if (!changed || signal?.aborted) {
|
|
246
|
+
try {
|
|
247
|
+
unlinkSync(tmp);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
/* gone */
|
|
251
|
+
}
|
|
252
|
+
if (signal?.aborted)
|
|
253
|
+
throw new CliError({ code: "interrupted", message: `interrupted before the rewritten ${basename(path)} was published; the original is untouched` });
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
publishTempFile(tmp, path, { overwrite: true });
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
function isObjKey(key) {
|
|
260
|
+
return key === "model.obj" || key === "model_obj";
|
|
261
|
+
}
|
|
262
|
+
function isMtlKey(key) {
|
|
263
|
+
return key === "model.mtl" || key === "model_mtl";
|
|
264
|
+
}
|
|
265
|
+
function isTextureKey(key) {
|
|
266
|
+
return /^texture[._]\d+[._]/.test(key);
|
|
267
|
+
}
|
|
268
|
+
/** Split an MTL map line into indentation, key, options and the referenced file. */
|
|
269
|
+
function parseMapLine(line) {
|
|
270
|
+
const indent = /^\s*/.exec(line)?.[0] ?? "";
|
|
271
|
+
const t = line.trim();
|
|
272
|
+
if (!t || t.startsWith("#"))
|
|
273
|
+
return null;
|
|
274
|
+
const key = keywordOf(t);
|
|
275
|
+
if (!TEXTURE_KEY_RE.test(key))
|
|
276
|
+
return null;
|
|
277
|
+
const rest = t.slice(key.length).trim();
|
|
278
|
+
if (!rest)
|
|
279
|
+
return null;
|
|
280
|
+
if (rest.startsWith("-")) {
|
|
281
|
+
const tokens = rest.split(WS);
|
|
282
|
+
return { indent, key, options: tokens.slice(0, -1).join(" "), ref: tokens.at(-1) };
|
|
283
|
+
}
|
|
284
|
+
return { indent, key, options: "", ref: rest };
|
|
285
|
+
}
|
|
286
|
+
/** Apply one rule: exactly one candidate resolves, several are an ambiguity, none falls through. */
|
|
287
|
+
function pick(candidates, method, identity) {
|
|
288
|
+
if (candidates.length === 1)
|
|
289
|
+
return { kind: "hit", name: candidates[0].name, method, identity };
|
|
290
|
+
if (candidates.length > 1)
|
|
291
|
+
return { kind: "ambiguous", method, candidates: candidates.map((c) => c.name) };
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
/** Channel rule: one texture of that channel is a (heuristic) hit, several are an ambiguity, none falls through. */
|
|
295
|
+
function pickByChannel(channel, textures, method) {
|
|
296
|
+
const candidates = textures.filter((t) => t.channel === channel);
|
|
297
|
+
if (candidates.length === 0)
|
|
298
|
+
return null;
|
|
299
|
+
if (candidates.length > 1)
|
|
300
|
+
return { kind: "ambiguous", method: "ambiguous", candidates: candidates.map((c) => c.name) };
|
|
301
|
+
return { kind: "hit", name: candidates[0].name, method, identity: false };
|
|
302
|
+
}
|
|
303
|
+
/** First pass: resolve one (key, reference) pair on its own evidence; competition between references is decided afterwards. */
|
|
304
|
+
function resolveTextureReference(key, ref, textures, distinctRefs) {
|
|
305
|
+
const refBase = basename(ref.replaceAll("\\", "/"));
|
|
306
|
+
const lower = refBase.toLowerCase();
|
|
307
|
+
// 1. The name the server served a texture under is the only evidence of which image the MTL meant.
|
|
308
|
+
const bySource = pick(textures.filter((t) => t.source_name !== null && t.source_name.toLowerCase() === lower), "source_name", true);
|
|
309
|
+
if (bySource)
|
|
310
|
+
return bySource;
|
|
311
|
+
// 2. A saved file of that name — unless it is known to come from a different
|
|
312
|
+
// source: the CLI's generated names can collide with another texture's
|
|
313
|
+
// server-side name, and "the file exists" says nothing about its identity.
|
|
314
|
+
const named = textures.filter((t) => t.name.toLowerCase() === lower);
|
|
315
|
+
if (named.length === 1) {
|
|
316
|
+
const t = named[0];
|
|
317
|
+
if (t.source_name === null || t.source_name.toLowerCase() === lower) {
|
|
318
|
+
return { kind: "hit", name: t.name, method: t.name === ref ? "unchanged" : "exact", identity: true };
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
kind: "ambiguous",
|
|
322
|
+
method: "ambiguous",
|
|
323
|
+
candidates: [t.name],
|
|
324
|
+
note: `'${refBase}' is the CLI's name for a texture the server served as '${t.source_name}', so it cannot be the file this reference meant`,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
if (named.length > 1)
|
|
328
|
+
return { kind: "ambiguous", method: "ambiguous", candidates: named.map((t) => t.name) };
|
|
329
|
+
const stem = stemOf(refBase);
|
|
330
|
+
const byStem = pick(textures.filter((t) => t.source_name !== null && stemOf(t.source_name) === stem), "source_stem", true);
|
|
331
|
+
if (byStem)
|
|
332
|
+
return byStem;
|
|
333
|
+
// 3. Heuristics: a channel word in the referenced name, then the channel the
|
|
334
|
+
// MTL key implies. Whichever one lands is what the second pass compares.
|
|
335
|
+
const inName = channelInFileName(refBase);
|
|
336
|
+
if (inName) {
|
|
337
|
+
const r = pickByChannel(inName, textures, "channel_in_name");
|
|
338
|
+
if (r)
|
|
339
|
+
return r;
|
|
340
|
+
}
|
|
341
|
+
const ofKey = MAP_KEY_CHANNEL[key.toLowerCase()];
|
|
342
|
+
if (ofKey) {
|
|
343
|
+
const r = pickByChannel(ofKey, textures, "channel_of_key");
|
|
344
|
+
if (r)
|
|
345
|
+
return r;
|
|
346
|
+
}
|
|
347
|
+
if (textures.length === 1 && distinctRefs === 1)
|
|
348
|
+
return { kind: "hit", name: textures[0].name, method: "only_texture", identity: false };
|
|
349
|
+
return { kind: "none" };
|
|
350
|
+
}
|
|
351
|
+
function pairId(key, ref) {
|
|
352
|
+
return `${key.toLowerCase()}\u0000${ref}`;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Second pass, two steps.
|
|
356
|
+
*
|
|
357
|
+
* Step 1 — one reference is one file. Every line that names the same file is
|
|
358
|
+
* reconciled across its keys: with identity evidence the keys agree by
|
|
359
|
+
* construction; otherwise each key's channel rule yields a candidate set (a hit
|
|
360
|
+
* is a set of one, an ambiguity its candidates, a key whose channel has no
|
|
361
|
+
* texture contributes nothing) and all of them must be the same single texture.
|
|
362
|
+
* When they are not — one key would make the file the base color while another
|
|
363
|
+
* could only make it one of two normal maps — no single texture fits every use,
|
|
364
|
+
* so every line of that reference stays as written and says why.
|
|
365
|
+
*
|
|
366
|
+
* Step 2 — one texture is one file too. A heuristic hit is vetoed when any
|
|
367
|
+
* *other* distinct reference contends for the same texture, by a hit of either
|
|
368
|
+
* kind or as an ambiguity it could not decide: nothing shows those references
|
|
369
|
+
* name the same image. Identity hits are never vetoed.
|
|
370
|
+
*/
|
|
371
|
+
function arbitrate(pairs) {
|
|
372
|
+
const decided = new Map();
|
|
373
|
+
// --- step 1: reconcile every reference across its keys
|
|
374
|
+
const byRef = new Map();
|
|
375
|
+
for (const p of pairs) {
|
|
376
|
+
const group = byRef.get(p.ref) ?? [];
|
|
377
|
+
group.push(p);
|
|
378
|
+
byRef.set(p.ref, group);
|
|
379
|
+
}
|
|
380
|
+
const candidatesOf = (res) => (res.kind === "hit" ? [res.name] : res.kind === "ambiguous" ? res.candidates : null);
|
|
381
|
+
const sameSet = (a, b) => a.length === b.length && a.every((x) => b.includes(x));
|
|
382
|
+
for (const [ref, group] of byRef) {
|
|
383
|
+
const evidence = group.filter((p) => candidatesOf(p.res) !== null);
|
|
384
|
+
const identity = group.some((p) => p.res.kind === "hit" && p.res.identity);
|
|
385
|
+
const first = evidence[0] ? candidatesOf(evidence[0].res) : null;
|
|
386
|
+
const consistent = identity || evidence.length <= 1 || evidence.every((p) => sameSet(candidatesOf(p.res), first));
|
|
387
|
+
if (consistent) {
|
|
388
|
+
for (const p of group)
|
|
389
|
+
decided.set(pairId(p.key, p.ref), p.res);
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const uses = evidence
|
|
393
|
+
.map((p) => (p.res.kind === "hit" ? `${p.key} would make it ${p.res.name} (${p.res.method})` : `${p.key} could only make it ${p.res.candidates.join(" or ")}`))
|
|
394
|
+
.join(" while ");
|
|
395
|
+
const note = `'${ref}' is used by ${evidence.map((p) => p.key).join(" and ")} but resolves differently per key: ${uses}; one reference names one file, so none of its lines is rewritten`;
|
|
396
|
+
for (const p of group) {
|
|
397
|
+
const own = candidatesOf(p.res);
|
|
398
|
+
decided.set(pairId(p.key, p.ref), own ? { kind: "ambiguous", method: "ambiguous", candidates: own, note } : p.res);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// --- step 2: heuristic hits compete on the texture they actually reached
|
|
402
|
+
const contenders = new Map();
|
|
403
|
+
const contend = (name, ref, method, identity) => {
|
|
404
|
+
const byRefName = contenders.get(name) ?? new Map();
|
|
405
|
+
if (!byRefName.has(ref) || identity)
|
|
406
|
+
byRefName.set(ref, method);
|
|
407
|
+
contenders.set(name, byRefName);
|
|
408
|
+
};
|
|
409
|
+
for (const { key, ref } of pairs) {
|
|
410
|
+
const res = decided.get(pairId(key, ref));
|
|
411
|
+
if (res.kind === "hit")
|
|
412
|
+
contend(res.name, ref, res.method, res.identity);
|
|
413
|
+
else if (res.kind === "ambiguous")
|
|
414
|
+
for (const c of res.candidates)
|
|
415
|
+
contend(c, ref, "ambiguous", false);
|
|
416
|
+
}
|
|
417
|
+
for (const { key, ref } of pairs) {
|
|
418
|
+
const id = pairId(key, ref);
|
|
419
|
+
const res = decided.get(id);
|
|
420
|
+
if (res.kind !== "hit" || res.identity)
|
|
421
|
+
continue;
|
|
422
|
+
const rivals = [...(contenders.get(res.name) ?? new Map())].filter(([r]) => r !== ref);
|
|
423
|
+
if (rivals.length === 0)
|
|
424
|
+
continue;
|
|
425
|
+
// The note is the same for every member of the group, so the caller's
|
|
426
|
+
// warning can say it once.
|
|
427
|
+
const note = `${[[ref, res.method], ...rivals]
|
|
428
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
429
|
+
.map(([r, m]) => `'${r}' (${m})`)
|
|
430
|
+
.join(" and ")} compete for ${res.name}; different references cannot share one texture without evidence that they name the same image`;
|
|
431
|
+
decided.set(id, { kind: "ambiguous", method: "ambiguous", candidates: [res.name], note });
|
|
432
|
+
}
|
|
433
|
+
return decided;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Relink the OBJ/MTL/texture files of one download. Returns null when the set
|
|
437
|
+
* has no text OBJ (nothing to relink). Never throws for unresolved or
|
|
438
|
+
* ambiguous references; those become warnings, `resolved_to: null` entries
|
|
439
|
+
* and `status: "incomplete"`.
|
|
440
|
+
*/
|
|
441
|
+
export async function relinkMaterials(files, opts = {}) {
|
|
442
|
+
const signal = opts.signal;
|
|
443
|
+
const obj = files.find((f) => isObjKey(f.key) && /\.obj$/i.test(f.path));
|
|
444
|
+
if (!obj)
|
|
445
|
+
return null;
|
|
446
|
+
if (signal?.aborted)
|
|
447
|
+
throw new CliError({ code: "interrupted", message: "interrupted before the material references were relinked" });
|
|
448
|
+
if (looksBinary(obj.path))
|
|
449
|
+
return null;
|
|
450
|
+
const mtl = files.find((f) => isMtlKey(f.key)) ?? null;
|
|
451
|
+
const textures = files
|
|
452
|
+
.filter((f) => isTextureKey(f.key))
|
|
453
|
+
.map((f) => {
|
|
454
|
+
const d = describeTextureKey(f.key);
|
|
455
|
+
return { key: f.key, name: basename(f.path), source_name: f.sourceName ?? null, set: d.set, channel: d.channel };
|
|
456
|
+
});
|
|
457
|
+
const report = {
|
|
458
|
+
obj: obj.path,
|
|
459
|
+
mtl: mtl?.path ?? null,
|
|
460
|
+
textures,
|
|
461
|
+
mtllib: [],
|
|
462
|
+
texture_maps: [],
|
|
463
|
+
rewritten: [],
|
|
464
|
+
status: "complete",
|
|
465
|
+
warnings: [],
|
|
466
|
+
};
|
|
467
|
+
// --- OBJ: every mtllib points at the MTL that was actually saved.
|
|
468
|
+
const mtlName = mtl ? basename(mtl.path) : null;
|
|
469
|
+
const objChanged = await rewriteLines(obj.path, (line, lineNo) => {
|
|
470
|
+
const t = line.trim();
|
|
471
|
+
if (!t || keywordOf(t) !== "mtllib")
|
|
472
|
+
return null;
|
|
473
|
+
const ref = t.slice("mtllib".length).trim();
|
|
474
|
+
if (!ref)
|
|
475
|
+
return null;
|
|
476
|
+
if (!mtlName) {
|
|
477
|
+
report.mtllib.push({ line: lineNo, material: null, reference: ref, resolved_to: null, method: "unresolved" });
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
if (ref === mtlName) {
|
|
481
|
+
report.mtllib.push({ line: lineNo, material: null, reference: ref, resolved_to: mtlName, method: "unchanged" });
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
report.mtllib.push({ line: lineNo, material: null, reference: ref, resolved_to: mtlName, method: "downloaded_mtl" });
|
|
485
|
+
const indent = /^\s*/.exec(line)?.[0] ?? "";
|
|
486
|
+
return `${indent}mtllib ${mtlName}`;
|
|
487
|
+
}, signal);
|
|
488
|
+
if (objChanged)
|
|
489
|
+
report.rewritten.push(obj.path);
|
|
490
|
+
if (!mtlName && report.mtllib.length > 0) {
|
|
491
|
+
report.status = "incomplete";
|
|
492
|
+
report.warnings.push(warning("material_reference_unresolved", `${basename(obj.path)} references ${report.mtllib.map((l) => `'${l.reference}'`).join(", ")} but no MTL was downloaded with it; the geometry loads without materials`));
|
|
493
|
+
}
|
|
494
|
+
// --- MTL: every map_* points at a texture that was actually saved, and only when the match is unambiguous.
|
|
495
|
+
if (mtl) {
|
|
496
|
+
if (signal?.aborted)
|
|
497
|
+
throw new CliError({ code: "interrupted", message: `interrupted before ${basename(mtl.path)} was relinked` });
|
|
498
|
+
let size = 0;
|
|
499
|
+
try {
|
|
500
|
+
size = statSync(mtl.path).size;
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
size = 0;
|
|
504
|
+
}
|
|
505
|
+
if (size > MAX_MTL_BYTES) {
|
|
506
|
+
report.status = "incomplete";
|
|
507
|
+
report.warnings.push(warning("material_reference_unresolved", `${basename(mtl.path)} is ${size} bytes; too large for an MTL, texture references were not checked`));
|
|
508
|
+
return report;
|
|
509
|
+
}
|
|
510
|
+
// Pass 1: every distinct (key, reference) pair on its own evidence.
|
|
511
|
+
const parsedLines = readFileSync(mtl.path, "utf8")
|
|
512
|
+
.split(/\r?\n/)
|
|
513
|
+
.map(parseMapLine)
|
|
514
|
+
.filter((p) => p !== null);
|
|
515
|
+
const distinctRefs = new Set(parsedLines.map((p) => p.ref));
|
|
516
|
+
const pairs = [];
|
|
517
|
+
const seenPairs = new Set();
|
|
518
|
+
for (const p of parsedLines) {
|
|
519
|
+
const id = pairId(p.key, p.ref);
|
|
520
|
+
if (seenPairs.has(id))
|
|
521
|
+
continue;
|
|
522
|
+
seenPairs.add(id);
|
|
523
|
+
pairs.push({ key: p.key, ref: p.ref, res: resolveTextureReference(p.key, p.ref, textures, distinctRefs.size) });
|
|
524
|
+
}
|
|
525
|
+
// Pass 2: heuristic hits compete on the texture they actually reached.
|
|
526
|
+
const decided = arbitrate(pairs);
|
|
527
|
+
let material = null;
|
|
528
|
+
const mtlChanged = await rewriteLines(mtl.path, (line, lineNo) => {
|
|
529
|
+
const t = line.trim();
|
|
530
|
+
if (keywordOf(t) === "newmtl") {
|
|
531
|
+
material = t.slice("newmtl".length).trim() || null;
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
const parsed = parseMapLine(line);
|
|
535
|
+
if (!parsed)
|
|
536
|
+
return null;
|
|
537
|
+
const res = decided.get(pairId(parsed.key, parsed.ref)) ?? { kind: "none" };
|
|
538
|
+
if (res.kind === "none") {
|
|
539
|
+
report.texture_maps.push({ line: lineNo, material, reference: parsed.ref, resolved_to: null, method: "unresolved" });
|
|
540
|
+
return null;
|
|
541
|
+
}
|
|
542
|
+
if (res.kind === "ambiguous") {
|
|
543
|
+
report.texture_maps.push({ line: lineNo, material, reference: parsed.ref, resolved_to: null, method: "ambiguous", candidates: res.candidates, ...(res.note ? { note: res.note } : {}) });
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
report.texture_maps.push({ line: lineNo, material, reference: parsed.ref, resolved_to: res.name, method: res.method });
|
|
547
|
+
if (res.name === parsed.ref)
|
|
548
|
+
return null;
|
|
549
|
+
return `${parsed.indent}${parsed.key}${parsed.options ? ` ${parsed.options}` : ""} ${res.name}`;
|
|
550
|
+
}, signal);
|
|
551
|
+
if (mtlChanged)
|
|
552
|
+
report.rewritten.push(mtl.path);
|
|
553
|
+
const ambiguous = report.texture_maps.filter((l) => l.method === "ambiguous");
|
|
554
|
+
const unresolved = report.texture_maps.filter((l) => l.method === "unresolved");
|
|
555
|
+
if (ambiguous.length > 0) {
|
|
556
|
+
report.status = "incomplete";
|
|
557
|
+
// One sentence per distinct reason; a note shared by a group of
|
|
558
|
+
// references (they compete for one texture) is said once, naming the
|
|
559
|
+
// material groups involved.
|
|
560
|
+
const reasons = new Map();
|
|
561
|
+
for (const l of ambiguous) {
|
|
562
|
+
const text = l.note ?? `'${l.reference}' could be ${l.candidates.join(" or ")}`;
|
|
563
|
+
const materials = reasons.get(text) ?? [];
|
|
564
|
+
if (l.material && !materials.includes(l.material))
|
|
565
|
+
materials.push(l.material);
|
|
566
|
+
reasons.set(text, materials);
|
|
567
|
+
}
|
|
568
|
+
report.warnings.push(warning("material_reference_ambiguous", `${basename(mtl.path)}: ${[...reasons].map(([text, materials]) => `${text}${materials.length ? ` (${materials.join(", ")})` : ""}`).join("; ")}; the references stay as written — the CLI does not guess between material groups or sources`));
|
|
569
|
+
}
|
|
570
|
+
if (unresolved.length > 0) {
|
|
571
|
+
report.status = "incomplete";
|
|
572
|
+
report.warnings.push(warning("material_reference_unresolved", `${basename(mtl.path)} references ${[...new Set(unresolved.map((l) => `'${l.reference}'`))].join(", ")} which ${textures.length === 0 ? "were not downloaded" : "match none of the downloaded textures"}; those maps stay as written`));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return report;
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=material-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-links.js","sourceRoot":"","sources":["../../src/internal/material-links.ts"],"names":[],"mappings":"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"}
|