mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +02:00
feat: generalization x3
This commit is contained in:
1 parent
2b81c71c5a
commit
def75da1d8
2 files changed
+76
-77
No files matched your search
@@ -3,12 +3,11 @@ import { readDVPLFile } from '../blitz/readDVPLFile';
|
|||||||
import { DdsStream } from '../streams/dds';
|
import { DdsStream } from '../streams/dds';
|
||||||
|
|
||||||
export async function readTexture(path: string) {
|
export async function readTexture(path: string) {
|
||||||
console.log(path);
|
|
||||||
|
|
||||||
const ddsTexturePath = path.replace('.tex', '.dx11.dds.dvpl');
|
const ddsTexturePath = path.replace('.tex', '.dx11.dds.dvpl');
|
||||||
const decompressedDvpl = await readDVPLFile(ddsTexturePath);
|
const decompressedDvpl = await readDVPLFile(ddsTexturePath);
|
||||||
const stream = new DdsStream(decompressedDvpl);
|
const stream = new DdsStream(decompressedDvpl);
|
||||||
const ddsRaw = await stream.dds();
|
const ddsRaw = await stream.dds();
|
||||||
|
|
||||||
const png = await sharp(ddsRaw.data, { raw: ddsRaw }).png().toBuffer();
|
const png = await sharp(ddsRaw.data, { raw: ddsRaw }).png().toBuffer();
|
||||||
|
|
||||||
return png;
|
return png;
|
||||||
|
|||||||
+75
-75
@@ -172,6 +172,79 @@ enum DdsCaps2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class DdsStream extends WindowsStream {
|
export class DdsStream extends WindowsStream {
|
||||||
|
async dds() {
|
||||||
|
this.magicNumber();
|
||||||
|
const header = this.header();
|
||||||
|
|
||||||
|
let dxgiFormat: DxgiFormat;
|
||||||
|
|
||||||
|
switch (header.pf.fourCC) {
|
||||||
|
case 'DXT3': {
|
||||||
|
dxgiFormat = DxgiFormat.BC2_UNORM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'DXT5': {
|
||||||
|
dxgiFormat = DxgiFormat.BC3_UNORM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'DX10': {
|
||||||
|
dxgiFormat = this.headerDxt10().dxgiFormat;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new TypeError(`Unsupported FourCC: ${header.pf.fourCC}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dxgiFormat) {
|
||||||
|
case DxgiFormat.BC1_TYPELESS:
|
||||||
|
case DxgiFormat.BC1_UNORM:
|
||||||
|
case DxgiFormat.BC1_UNORM_SRGB: {
|
||||||
|
return this.iterateBlocks(header.width, header.height, () => {
|
||||||
|
const colorInterpolations = this.bc1ColorInterpolations();
|
||||||
|
const colorKeys = this.bc1ColorKeys();
|
||||||
|
return (index) => colorInterpolations[colorKeys[index]];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
case DxgiFormat.BC2_TYPELESS:
|
||||||
|
case DxgiFormat.BC2_UNORM:
|
||||||
|
case DxgiFormat.BC2_UNORM_SRGB: {
|
||||||
|
return this.iterateBlocks(header.width, header.height, () => {
|
||||||
|
const alphaInterpolations = this.bc2AlphaInterpolations();
|
||||||
|
const colorInterpolations = this.bc2ColorInterpolations();
|
||||||
|
const colorKeys = this.bc1ColorKeys();
|
||||||
|
return (index) => [
|
||||||
|
...colorInterpolations[colorKeys[index]],
|
||||||
|
alphaInterpolations[colorKeys[index]],
|
||||||
|
];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
case DxgiFormat.BC3_TYPELESS:
|
||||||
|
case DxgiFormat.BC3_UNORM:
|
||||||
|
case DxgiFormat.BC3_UNORM_SRGB: {
|
||||||
|
return this.iterateBlocks(header.width, header.height, () => {
|
||||||
|
const alphaInterpolations = this.bc3AlphaInterpolations();
|
||||||
|
const alphaKeys = this.bc3AlphaKeys();
|
||||||
|
const colorInterpolations = this.bc2ColorInterpolations();
|
||||||
|
const colorKeys = this.bc1ColorKeys();
|
||||||
|
return (index) => [
|
||||||
|
...colorInterpolations[colorKeys[index]],
|
||||||
|
alphaInterpolations[alphaKeys[index]],
|
||||||
|
];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new TypeError(
|
||||||
|
`Unsupported DXGI format: ${DxgiFormat[dxgiFormat]} (${dxgiFormat})`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
magicNumber() {
|
magicNumber() {
|
||||||
const magic = this.dword();
|
const magic = this.dword();
|
||||||
|
|
||||||
@@ -254,7 +327,7 @@ export class DdsStream extends WindowsStream {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return { data, width, height, channels: 4 };
|
return { data, width, height, channels: 4 as const };
|
||||||
}
|
}
|
||||||
|
|
||||||
readR5G6B5Int() {
|
readR5G6B5Int() {
|
||||||
@@ -281,7 +354,7 @@ export class DdsStream extends WindowsStream {
|
|||||||
const color0 = this.R5G6B5A0();
|
const color0 = this.R5G6B5A0();
|
||||||
const int1 = this.readR5G6B5Int();
|
const int1 = this.readR5G6B5Int();
|
||||||
const color1 = this.R5G6B5A0();
|
const color1 = this.R5G6B5A0();
|
||||||
const alpha = int0 < int1;
|
const alpha = int0 > int1;
|
||||||
const color2 = alpha
|
const color2 = alpha
|
||||||
? (color0.map(
|
? (color0.map(
|
||||||
(channel0, index) => (channel0 + color1[index]) / 2,
|
(channel0, index) => (channel0 + color1[index]) / 2,
|
||||||
@@ -393,77 +466,4 @@ export class DdsStream extends WindowsStream {
|
|||||||
|
|
||||||
return [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p];
|
return [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p];
|
||||||
}
|
}
|
||||||
|
|
||||||
async dds() {
|
|
||||||
this.magicNumber();
|
|
||||||
const header = this.header();
|
|
||||||
|
|
||||||
let dxgiFormat: DxgiFormat;
|
|
||||||
|
|
||||||
switch (header.pf.fourCC) {
|
|
||||||
case 'DXT3': {
|
|
||||||
dxgiFormat = DxgiFormat.BC2_UNORM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'DXT5': {
|
|
||||||
dxgiFormat = DxgiFormat.BC3_UNORM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'DX10': {
|
|
||||||
dxgiFormat = this.headerDxt10().dxgiFormat;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new TypeError(`Unsupported FourCC: ${header.pf.fourCC}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (dxgiFormat) {
|
|
||||||
case DxgiFormat.BC1_TYPELESS:
|
|
||||||
case DxgiFormat.BC1_UNORM:
|
|
||||||
case DxgiFormat.BC1_UNORM_SRGB: {
|
|
||||||
return this.iterateBlocks(header.width, header.height, () => {
|
|
||||||
const colorInterpolations = this.bc1ColorInterpolations();
|
|
||||||
const colorKeys = this.bc1ColorKeys();
|
|
||||||
return (index) => colorInterpolations[colorKeys[index]];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
case DxgiFormat.BC2_TYPELESS:
|
|
||||||
case DxgiFormat.BC2_UNORM:
|
|
||||||
case DxgiFormat.BC2_UNORM_SRGB: {
|
|
||||||
return this.iterateBlocks(header.width, header.height, () => {
|
|
||||||
const alphaInterpolations = this.bc2AlphaInterpolations();
|
|
||||||
const colorInterpolations = this.bc2ColorInterpolations();
|
|
||||||
const colorKeys = this.bc1ColorKeys();
|
|
||||||
return (index) => [
|
|
||||||
...colorInterpolations[colorKeys[index]],
|
|
||||||
alphaInterpolations[colorKeys[index]],
|
|
||||||
];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
case DxgiFormat.BC3_TYPELESS:
|
|
||||||
case DxgiFormat.BC3_UNORM:
|
|
||||||
case DxgiFormat.BC3_UNORM_SRGB: {
|
|
||||||
return this.iterateBlocks(header.width, header.height, () => {
|
|
||||||
const alphaInterpolations = this.bc3AlphaInterpolations();
|
|
||||||
const alphaKeys = this.bc3AlphaKeys();
|
|
||||||
const colorInterpolations = this.bc2ColorInterpolations();
|
|
||||||
const colorKeys = this.bc1ColorKeys();
|
|
||||||
return (index) => [
|
|
||||||
...colorInterpolations[colorKeys[index]],
|
|
||||||
alphaInterpolations[alphaKeys[index]],
|
|
||||||
];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new TypeError(
|
|
||||||
`Unsupported DXGI format: ${DxgiFormat[dxgiFormat]} (${dxgiFormat})`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user