81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
import fs from "fs";
|
|
import path from "path";
|
|
import color from "picocolors";
|
|
import { checkRequiredFiles, modifyGltfContent, listGltfFiles, BACKUP_SUFFIX } from "../../utils/gltf.js";
|
|
import { runInteractive, showSummary } from "./ui.js";
|
|
import { stopKeypress, waitForKey } from "../../keyboard.js";
|
|
|
|
export function runGltfExtension(config = { files: [], extensions: ["textureBasisu"] }) {
|
|
const cwd = process.cwd();
|
|
const { files = [], extensions = ["textureBasisu"] } = config;
|
|
const selectedExtensions = extensions.length ? extensions : ["textureBasisu"];
|
|
|
|
const { ok, missing } = checkRequiredFiles();
|
|
if (!ok) {
|
|
console.log(color.red("\n✖ 缺少必要文件: " + missing.join(", ")));
|
|
console.log(color.dim("请确保当前目录包含 .ktx2、.gltf 和 .bin 文件\n"));
|
|
return { success: false, count: 0 };
|
|
}
|
|
|
|
const fallbackFiles = listGltfFiles();
|
|
const gltfFiles = (files.length ? files : fallbackFiles).filter(f => f.toLowerCase().endsWith(".gltf"));
|
|
if (!gltfFiles.length) {
|
|
console.log(color.yellow("未选择可处理的 glTF 文件"));
|
|
return { success: false, count: 0 };
|
|
}
|
|
|
|
let count = 0;
|
|
|
|
for (const file of gltfFiles) {
|
|
const fullPath = path.join(cwd, file);
|
|
if (!fs.existsSync(fullPath)) {
|
|
console.log(color.yellow("跳过缺失的文件: " + file));
|
|
continue;
|
|
}
|
|
const baseName = file.replace(/\.gltf$/i, "");
|
|
const backupName = baseName + BACKUP_SUFFIX + ".gltf";
|
|
const backupPath = path.join(cwd, backupName);
|
|
|
|
fs.copyFileSync(fullPath, backupPath);
|
|
const modified = modifyGltfContent(fullPath, selectedExtensions);
|
|
fs.writeFileSync(fullPath, JSON.stringify(modified, null, 2), "utf-8");
|
|
console.log(color.green("✓ " + file + " (备份: " + backupName + ")"));
|
|
count++;
|
|
}
|
|
|
|
return { success: count > 0, count };
|
|
}
|
|
|
|
async function run() {
|
|
const result = await runInteractive();
|
|
if (!result) return "back";
|
|
|
|
stopKeypress();
|
|
|
|
const { results } = result;
|
|
const config = {
|
|
files: results[0] || [],
|
|
extensions: results[1] || []
|
|
};
|
|
|
|
showSummary([
|
|
"处理文件: " + (config.files.length ? config.files.join(", ") : "未选择"),
|
|
"扩展选项: " + (config.extensions.length ? config.extensions.join(", ") : "未选择")
|
|
]);
|
|
|
|
const { success, count } = runGltfExtension(config);
|
|
if (success) {
|
|
console.log(color.green("\n✓ 已修改 " + count + " 个 glTF 文件"));
|
|
}
|
|
|
|
await waitForKey();
|
|
return "back";
|
|
}
|
|
|
|
export default {
|
|
id: "gltf",
|
|
name: "glTF扩展",
|
|
desc: "添加KTX2纹理扩展",
|
|
run,
|
|
};
|