@threlte/gltf
Version:
GLTF to Threlte converter
99 lines (91 loc) • 3.92 kB
JavaScript
#!/usr/bin/env node
'use strict'
import { dirname, parse } from 'node:path'
import { fileURLToPath } from 'node:url'
import meow from 'meow'
import { readPackageUpSync } from 'read-pkg-up'
import gltf from './src/index.js'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const cli = meow(
`
Usage
$ npx @threlte/gltf@latest [Model.glb] [options]
Options
--output, -o Output file name/path
--types, -t Add Typescript definitions
--keepnames, -k Keep original names
--keepgroups, -K Keep (empty) groups, disable pruning
--meta, -m Include metadata (as userData)
--shadows, -s Let meshes cast and receive shadows
--printwidth, -w Prettier printWidth (default: 120)
--precision, -p Number of fractional digits (default: 2)
--draco, -d Draco binary path
--preload -P Add preload method to module script
--suspense -u Make the component suspense-ready
--isolated, -i Output as isolated module
--root, -r Sets directory from which .gltf file is served
--transform, -T Transform the asset for the web (draco, prune, resize)
--resolution, -R Transform resolution for texture resizing (default: 1024)
--keepmeshes, -j Do not join compatible meshes
--keepmaterials, -M Do not palette join materials
--format, -f Texture format (default: "webp")
--simplify, -S Transform simplification (default: false)
--ratio Simplifier ratio (default: 0.75)
--error Simplifier error threshold (default: 0.001)
--debug, -D Debug output
`,
{
importMeta: import.meta,
flags: {
output: { type: 'string', shortFlag: 'o' },
types: { type: 'boolean', shortFlag: 't' },
keepnames: { type: 'boolean', shortFlag: 'k' },
keepgroups: { type: 'boolean', shortFlag: 'K' },
shadows: { type: 'boolean', shortFlag: 's' },
printwidth: { type: 'number', shortFlag: 'w', default: 120 },
meta: { type: 'boolean', shortFlag: 'm' },
precision: { type: 'number', shortFlag: 'p', default: 2 },
isolated: { type: 'boolean', shortFlag: 'i', default: false },
preload: { type: 'boolean', shortFlag: 'P', default: false },
suspense: { type: 'boolean', shortFlag: 'u', default: false },
draco: { type: 'string', shortFlag: 'd' },
root: { type: 'string', shortFlag: 'r' },
transform: { type: 'boolean', shortFlag: 'T' },
resolution: { type: 'number', shortFlag: 'R', default: 1024 },
degrade: { type: 'string', shortFlag: 'q', default: '' },
degraderesolution: { type: 'number', shortFlag: 'Q', default: 512 },
simplify: { type: 'boolean', shortFlag: 'S', default: false },
keepmeshes: { type: 'boolean', shortFlag: 'j', default: false },
keepmaterials: { type: 'boolean', shortFlag: 'M', default: false },
format: { type: 'string', shortFlag: 'f', default: 'webp' },
ratio: { type: 'number', default: 0.75 },
error: { type: 'number', default: 0.001 },
debug: { type: 'boolean', shortFlag: 'D' }
}
}
)
const { packageJson } = readPackageUpSync({ cwd: __dirname, normalize: false })
if (cli.input.length === 0) {
console.log(cli.help)
} else {
const file = cli.input[0]
const name = parse(file).name
const output = cli.flags.output
? cli.flags.output.endsWith('.svelte')
? cli.flags.output
: `${cli.flags.output}.svelte`
: `${name}.svelte`
try {
await gltf(file, output, {
...cli.flags,
header: `Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf
Command: npx @threlte/gltf@${packageJson.version} ${process.argv.slice(2).join(' ')}`,
showLog: (log) => console.info('log:', log),
timeout: 0,
delay: 1
})
} catch (e) {
console.error(e)
}
}