Sprite-mode bake gains an additive --pixels-per-meter flag. When set, the value is written into sprites.uv.json under atlas_meta. pixels_per_meter. Consumers (lib-core.render path-1 via per-entity sprite_scale) divide their project canonical px/m by this number to auto-scale the rendered quad — atlas-native resolution no longer needs to match the project tile-scale. Unset (legacy bakes): atlas_meta omitted, byte-equal to v0.3.0 output. Tests: 53/53 pass; existing buildUvJson test continues to assert the unset-default shape. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
#!/usr/bin/env node
|
|
// CLI entry. Parses args, dispatches to bake(), prints summary.
|
|
|
|
const { bake } = require('../src/bake');
|
|
|
|
function parseArgs(argv) {
|
|
const opts = {};
|
|
for (let i = 0; i < argv.length; i++) {
|
|
const a = argv[i];
|
|
const next = argv[i + 1];
|
|
switch (a) {
|
|
case '--in': opts.inDir = next; i++; break;
|
|
case '--out': opts.outDir = next; i++; break;
|
|
case '--atlas-id': opts.atlasId = next; i++; break;
|
|
case '--tile-size':
|
|
opts.tileSize = (next === 'auto') ? 'auto' : parseInt(next, 10);
|
|
i++;
|
|
break;
|
|
case '--max-size': opts.maxSize = parseInt(next, 10); i++; break;
|
|
case '--lock': opts.lockPath = next; i++; break;
|
|
case '--blocks-sight-pattern':
|
|
opts.blocksSightPattern = new RegExp(next); i++; break;
|
|
case '--pad-px': opts.padPx = parseInt(next, 10); i++; break;
|
|
case '--schema': opts.schema = next; i++; break;
|
|
case '--mode': opts.mode = next; i++; break;
|
|
case '--strip-prefix': opts.stripPrefix = next; i++; break;
|
|
case '--pixels-per-meter':
|
|
opts.pixelsPerMeter = parseInt(next, 10); i++; break;
|
|
case '--verbose': opts.verbose = true; break;
|
|
default:
|
|
console.error(`unknown arg: ${a}`);
|
|
process.exit(2);
|
|
}
|
|
}
|
|
return opts;
|
|
}
|
|
|
|
(async () => {
|
|
try {
|
|
const opts = parseArgs(process.argv.slice(2));
|
|
const result = await bake(opts);
|
|
if (opts.mode === 'sprite') {
|
|
console.log(
|
|
`OK ${result.atlasId}: ${result.spriteCount} sprites, `
|
|
+ `${result.boundsW}x${result.boundsH} px atlas`
|
|
);
|
|
} else {
|
|
console.log(
|
|
`OK ${result.atlasId}: ${result.tileCount} tiles, `
|
|
+ `${result.boundsW}x${result.boundsH} px atlas`
|
|
);
|
|
}
|
|
process.exit(0);
|
|
} catch (err) {
|
|
console.error('ERROR:', err.message);
|
|
if (err.scanErrors) {
|
|
for (const e of err.scanErrors) console.error(' ', e);
|
|
}
|
|
process.exit(1);
|
|
}
|
|
})();
|