* fix(assimp): pass -f<format> so non-extension targets work
The assimp converter invokes `assimp export <in> <out>` and relies on
assimp's extension-based format inference to pick the output format.
That works for targets whose id happens to match a real file extension
(glb, gltf, obj, stl, ply, etc.) but silently fails for every target
whose assimp id is not a conventional filename extension:
glb2, gltf2, objnomtl, stlb, plyb, fbxa, assbin, assxml, pbrt, assjson
Picking any of those in the UI aborts the job with:
assimp export: no output format specified and I failed to guess it
assimp_cmd's `-f<h>` flag overrides extension inference, and the values
in `properties.to.object` already correspond 1:1 to assimp's format ids
(verified against `assimp listexport`). Passing `-f${convertTo}` makes
every advertised target work without changing anything else.
Reproduction: upload any .stl, convert to glb2. Before: ENOENT on the
nonexistent output file. After: valid binary glTF 2.0.
* fix(assimp): write real file extensions for non-extension format ids
Follow-up to the previous commit. With `-f<format>` now passed to
assimp, every advertised target exports successfully — but seven of
them still produce files with assimp's internal format id as the
extension, which no third-party viewer recognises:
glb2 → .glb2 (really binary glTF 2.0, should be .glb)
gltf2 → .gltf2 (text glTF 2.0, should be .gltf)
objnomtl → .objnomtl (OBJ without .mtl, should be .obj)
stlb → .stlb (binary STL, should be .stl)
plyb → .plyb (binary PLY, should be .ply)
fbxa → .fbxa (ASCII FBX, should be .fbx)
assjson → .assjson (JSON dump, should be .json)
Map these in `normalizeOutputFiletype`, the same helper that already
handles jpeg→jpg, latex→tex, markdown→md. The format id on `convertTo`
is untouched, so `assimp -f<id>` still selects the correct
encoding/variant — only the output filename changes.
assbin, assxml, and pbrt are both the format id and the canonical
extension, so they need no mapping.
* style(assimp): fix prettier formatting
144 lines
2.2 KiB
TypeScript
144 lines
2.2 KiB
TypeScript
import { execFile as execFileOriginal } from "node:child_process";
|
|
import { ExecFileFn } from "./types";
|
|
|
|
export const properties = {
|
|
from: {
|
|
object: [
|
|
"3d",
|
|
"3ds",
|
|
"3mf",
|
|
"ac",
|
|
"ac3d",
|
|
"acc",
|
|
"amf",
|
|
"amj",
|
|
"ase",
|
|
"ask",
|
|
"assbin",
|
|
"b3d",
|
|
"blend",
|
|
"bsp",
|
|
"bvh",
|
|
"cob",
|
|
"csm",
|
|
"dae",
|
|
"dxf",
|
|
"enff",
|
|
"fbx",
|
|
"glb",
|
|
"gltf",
|
|
"hmb",
|
|
"hmp",
|
|
"ifc",
|
|
"ifczip",
|
|
"iqm",
|
|
"irr",
|
|
"irrmesh",
|
|
"lwo",
|
|
"lws",
|
|
"lxo",
|
|
"m3d",
|
|
"md2",
|
|
"md3",
|
|
"md5anim",
|
|
"md5camera",
|
|
"md5mesh",
|
|
"mdc",
|
|
"mdl",
|
|
"mesh.xml",
|
|
"mesh",
|
|
"mot",
|
|
"ms3d",
|
|
"ndo",
|
|
"nff",
|
|
"obj",
|
|
"off",
|
|
"ogex",
|
|
"pk3",
|
|
"ply",
|
|
"pmx",
|
|
"prj",
|
|
"q3o",
|
|
"q3s",
|
|
"raw",
|
|
"scn",
|
|
"sib",
|
|
"smd",
|
|
"step",
|
|
"stl",
|
|
"stp",
|
|
"ter",
|
|
"uc",
|
|
"usd",
|
|
"usda",
|
|
"usdc",
|
|
"usdz",
|
|
"vta",
|
|
"x",
|
|
"x3d",
|
|
"x3db",
|
|
"xgl",
|
|
"xml",
|
|
"zae",
|
|
"zgl",
|
|
],
|
|
},
|
|
to: {
|
|
object: [
|
|
"3ds",
|
|
"3mf",
|
|
"assbin",
|
|
"assjson",
|
|
"assxml",
|
|
"collada",
|
|
"dae",
|
|
"fbx",
|
|
"fbxa",
|
|
"glb",
|
|
"glb2",
|
|
"gltf",
|
|
"gltf2",
|
|
"json",
|
|
"obj",
|
|
"objnomtl",
|
|
"pbrt",
|
|
"ply",
|
|
"plyb",
|
|
"stl",
|
|
"stlb",
|
|
"stp",
|
|
"x",
|
|
],
|
|
},
|
|
};
|
|
|
|
export async function convert(
|
|
filePath: string,
|
|
fileType: string,
|
|
convertTo: string,
|
|
targetPath: string,
|
|
options?: unknown,
|
|
execFile: ExecFileFn = execFileOriginal, // to make it mockable
|
|
): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
execFile(
|
|
"assimp",
|
|
["export", filePath, targetPath, `-f${convertTo}`],
|
|
(error, stdout, stderr) => {
|
|
if (error) {
|
|
reject(`error: ${error}`);
|
|
}
|
|
|
|
if (stdout) {
|
|
console.log(`stdout: ${stdout}`);
|
|
}
|
|
|
|
if (stderr) {
|
|
console.error(`stderr: ${stderr}`);
|
|
}
|
|
|
|
resolve("Done");
|
|
},
|
|
);
|
|
});
|
|
}
|