mirror of
				https://github.com/tobspr/shapez.io.git
				synced 2025-06-13 13:04:03 +00:00 
			
		
		
		
	* Format tsconfig, remove atlas files * Add helpers for texture packing * Rest of the texture packing... * Update gitignores * Update readme
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const { join, resolve } = require("path");
 | 
						|
const { readFileSync, readdirSync, writeFileSync } = require("fs");
 | 
						|
 | 
						|
const suffixToScale = {
 | 
						|
    lq: "0.25",
 | 
						|
    mq: "0.5",
 | 
						|
    hq: "0.75"
 | 
						|
};
 | 
						|
 | 
						|
function convert(srcDir) {
 | 
						|
    const full = resolve(srcDir);
 | 
						|
    const srcFiles = readdirSync(full)
 | 
						|
        .filter(n => n.endsWith(".atlas"))
 | 
						|
        .map(n => join(full, n));
 | 
						|
 | 
						|
    for (const atlas of srcFiles) {
 | 
						|
        console.log(`Processing: ${atlas}`);
 | 
						|
 | 
						|
        // Read all text, split it into line array
 | 
						|
        // and filter all empty lines
 | 
						|
        const lines = readFileSync(atlas, "utf-8")
 | 
						|
            .split("\n")
 | 
						|
            .filter(n => n.trim());
 | 
						|
 | 
						|
        // Get source image name
 | 
						|
        const image = lines.shift();
 | 
						|
        const srcMeta = {};
 | 
						|
 | 
						|
        // Read all metadata (supports only one page)
 | 
						|
        while (true) {
 | 
						|
            const kv = lines.shift().split(":");
 | 
						|
            if (kv.length != 2) {
 | 
						|
                lines.unshift(kv[0]);
 | 
						|
                break;
 | 
						|
            }
 | 
						|
 | 
						|
            srcMeta[kv[0]] = kv[1].trim();
 | 
						|
        }
 | 
						|
 | 
						|
        const frames = {};
 | 
						|
        let current = null;
 | 
						|
 | 
						|
        lines.push("Dummy line to make it convert last frame");
 | 
						|
 | 
						|
        for (const line of lines) {
 | 
						|
            if (!line.startsWith("  ")) {
 | 
						|
                // New frame, convert previous if it exists
 | 
						|
                if (current != null) {
 | 
						|
                    let { name, rotate, xy, size, orig, offset, index } = current;
 | 
						|
 | 
						|
                    // Convert to arrays because Node.js doesn't
 | 
						|
                    // support latest JS features
 | 
						|
                    xy = xy.split(",").map(v => Number(v));
 | 
						|
                    size = size.split(",").map(v => Number(v));
 | 
						|
                    orig = orig.split(",").map(v => Number(v));
 | 
						|
                    offset = offset.split(",").map(v => Number(v));
 | 
						|
 | 
						|
                    // GDX TexturePacker removes index suffixes
 | 
						|
                    const indexSuff = index != -1 ? `_${index}` : "";
 | 
						|
                    const isTrimmed = size != orig;
 | 
						|
 | 
						|
                    frames[`${name}${indexSuff}.png`] = {
 | 
						|
                        // Bounds on atlas
 | 
						|
                        frame: {
 | 
						|
                            x: xy[0],
 | 
						|
                            y: xy[1],
 | 
						|
                            w: size[0],
 | 
						|
                            h: size[1]
 | 
						|
                        },
 | 
						|
 | 
						|
                        // Whether image was rotated
 | 
						|
                        rotated: rotate == "true",
 | 
						|
                        trimmed: isTrimmed,
 | 
						|
 | 
						|
                        // How is the image trimmed
 | 
						|
                        spriteSourceSize: {
 | 
						|
                            x: offset[0],
 | 
						|
                            y: (orig[1] - size[1]) - offset[1],
 | 
						|
                            w: size[0],
 | 
						|
                            h: size[1]
 | 
						|
                        },
 | 
						|
                        
 | 
						|
                        sourceSize: {
 | 
						|
                            w: orig[0],
 | 
						|
                            h: orig[1]
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                // Simple object that will hold other metadata
 | 
						|
                current = {
 | 
						|
                    name: line
 | 
						|
                };
 | 
						|
            } else {
 | 
						|
                // Read and set current image metadata
 | 
						|
                const kv = line.split(":").map(v => v.trim());
 | 
						|
                current[kv[0]] = isNaN(Number(kv[1])) ? kv[1] : Number(kv[1]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        const atlasSize = srcMeta.size.split(",").map(v => Number(v));
 | 
						|
        const atlasScale = suffixToScale[atlas.match(/_(\w+)\.atlas$/)[1]];
 | 
						|
 | 
						|
        const result = JSON.stringify({
 | 
						|
            frames,
 | 
						|
            meta: {
 | 
						|
                image,
 | 
						|
                format: srcMeta.format,
 | 
						|
                size: {
 | 
						|
                    w: atlasSize[0],
 | 
						|
                    h: atlasSize[1]
 | 
						|
                },
 | 
						|
                scale: atlasScale.toString()
 | 
						|
            }
 | 
						|
        });
 | 
						|
 | 
						|
        writeFileSync(atlas.replace(".atlas", ".json"), result, {
 | 
						|
            encoding: "utf-8"
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
if (require.main == module) {
 | 
						|
    convert(process.argv[2]);
 | 
						|
}
 | 
						|
 | 
						|
module.exports = { convert };
 |