mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 18:57:03 +02:00
feat: use PVRTexToolCLI
This commit is contained in:
1 parent
4ad10deb00
commit
0627f678ea
4 files changed
+99
-107
No files matched your search
@@ -1,67 +0,0 @@
|
||||
import { execFile } from 'child_process';
|
||||
import { existsSync } from 'fs';
|
||||
import { mkdir, readFile, rm, writeFile } from 'fs/promises';
|
||||
import { uniqueId } from 'lodash';
|
||||
import { promisify } from 'util';
|
||||
|
||||
export async function clearDdsToPng() {
|
||||
await rm('temp/ddsToPng/images', { force: true, recursive: true });
|
||||
}
|
||||
|
||||
const execFilePromise = promisify(execFile);
|
||||
let downloadStatus: Promise<void> | undefined = undefined;
|
||||
|
||||
export async function ddsToPng(ddsBuffer: Buffer) {
|
||||
const id = uniqueId();
|
||||
await mkdir('temp/ddsToPng/images', { recursive: true });
|
||||
|
||||
if (
|
||||
!existsSync('temp/ddsToPng/texconv.exe') &&
|
||||
downloadStatus === undefined
|
||||
) {
|
||||
console.log('texconv.exe not found, downloading...');
|
||||
|
||||
downloadStatus = new Promise<void>(async (resolve, reject) => {
|
||||
const releaseResponse = await fetch(
|
||||
'https://api.github.com/repos/microsoft/DirectXTex/releases/latest',
|
||||
);
|
||||
const releaseData = (await releaseResponse.json()) as {
|
||||
assets: { browser_download_url: string; name: string }[];
|
||||
};
|
||||
const asset = releaseData.assets.find(
|
||||
(asset) => asset.name === 'texconv.exe',
|
||||
);
|
||||
|
||||
if (!asset) throw new Error('Could not find texconv.exe');
|
||||
|
||||
const downloadResponse = await fetch(asset.browser_download_url);
|
||||
const downloadData = await downloadResponse.arrayBuffer();
|
||||
|
||||
await writeFile(
|
||||
'temp/ddsToPng/texconv.exe',
|
||||
new Uint8Array(downloadData),
|
||||
);
|
||||
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
await downloadStatus;
|
||||
|
||||
return new Promise<Buffer>(async (resolve, reject) => {
|
||||
await writeFile(`temp/ddsToPng/images/${id}.dds`, ddsBuffer);
|
||||
await execFilePromise('temp/ddsToPng/texconv.exe', [
|
||||
'-ft',
|
||||
'png',
|
||||
'-o',
|
||||
'temp/ddsToPng/images',
|
||||
`temp/ddsToPng/images/${id}.dds`,
|
||||
]);
|
||||
|
||||
const pngBuffer = await readFile(`temp/ddsToPng/images/${id}.png`);
|
||||
|
||||
resolve(pngBuffer);
|
||||
rm(`temp/ddsToPng/images/${id}.dds`);
|
||||
// rm(`temp/ddsToPng/images/${id}.png`);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { exec } from 'child_process';
|
||||
import { mkdir, readFile, rm, writeFile } from 'fs/promises';
|
||||
import { generateUUID } from 'three/src/math/MathUtils';
|
||||
import { promisify } from 'util';
|
||||
|
||||
const execPromise = promisify(exec);
|
||||
|
||||
interface ToPngOptions {
|
||||
format: string;
|
||||
alpha: boolean;
|
||||
}
|
||||
|
||||
const toPngDefaultOptions: ToPngOptions = {
|
||||
format: 'dds',
|
||||
alpha: true,
|
||||
};
|
||||
|
||||
export async function toPng(
|
||||
inputBuffer: Buffer,
|
||||
options?: Partial<ToPngOptions>,
|
||||
) {
|
||||
const mergedOptions = { ...toPngDefaultOptions, ...options };
|
||||
const id = generateUUID();
|
||||
await mkdir('temp/toPng', { recursive: true });
|
||||
await writeFile(`temp/toPng/${id}.${mergedOptions.format}`, inputBuffer);
|
||||
await execPromise(
|
||||
`PVRTexToolCLI -noout -i temp/toPng/${id}.${mergedOptions.format} -f ${
|
||||
mergedOptions.alpha ? 'r8g8b8a8' : 'r8g8b8'
|
||||
},UB,sRGB -d temp/toPng/${id}.png`,
|
||||
);
|
||||
|
||||
const pngBuffer = await readFile(`temp/toPng/${id}.png`);
|
||||
|
||||
rm(`temp/toPng/${id}.${mergedOptions.format}`);
|
||||
rm(`temp/toPng/${id}.png`);
|
||||
|
||||
return pngBuffer;
|
||||
}
|
||||
Reference in new issue
Block a user