From d5f14bade3dbe12866c779f7b93efed84e104b1b Mon Sep 17 00:00:00 2001 From: kion Date: Wed, 25 Sep 2024 16:56:52 +0900 Subject: [PATCH] encode the textures --- miku/title-smol.png | Bin 9574 -> 6515 bytes out/.gitkeep | 0 src/GAME.ts | 155 +++++++------------------------------------- test/logo.test.ts | 2 +- 4 files changed, 23 insertions(+), 134 deletions(-) create mode 100644 out/.gitkeep diff --git a/miku/title-smol.png b/miku/title-smol.png index 4590390e4bfd74c42e959c64286b6466d27c8b98..d50b57872b2972aa6607609d61d5065952874163 100644 GIT binary patch delta 2909 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 Hu0mjf#Sfoj diff --git a/out/.gitkeep b/out/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/GAME.ts b/src/GAME.ts index da87af5..c7559fe 100644 --- a/src/GAME.ts +++ b/src/GAME.ts @@ -20,52 +20,7 @@ **/ import { readFileSync, writeFileSync } from "fs"; -import { PNG } from "pngjs"; -import { - encodePalette, - encodeCutSceneTexture, - encodeTexel, - compressNewSegment, - encodeBitfield, - readPixel, -} from "./EncodeTexture"; - -type Pixel = { - r: number; - g: number; - b: number; - a: number; -}; - -const wordToColor = (word: number): Pixel => { - const r = ((word >> 0x00) & 0x1f) << 3; - const g = ((word >> 0x05) & 0x1f) << 3; - const b = ((word >> 0x0a) & 0x1f) << 3; - const a = word > 0 ? 255 : 0; - return { r, g, b, a }; -}; - -const compressData = (decompressed: Buffer) => { - const SEGMENT_LENGTH = 0x2000; - const segmentCount = Math.ceil(decompressed.length / SEGMENT_LENGTH); - const segments: Buffer[] = []; - for (let i = 0; i < segmentCount; i++) { - segments.push( - decompressed.subarray(i * SEGMENT_LENGTH, (i + 1) * SEGMENT_LENGTH), - ); - } - - const bucket: boolean[] = []; - const loads: Buffer[] = []; - segments.forEach((segment, index) => { - const { bits, outBuffer } = compressNewSegment(segment, 0); - bits.forEach((bit) => bucket.push(bit)); - loads.push(outBuffer); - }); - - const bitfied = encodeBitfield(bucket); - return [bitfied, Buffer.concat(loads)]; -}; +import { encodeCutSceneTexture, compressNewTexture } from "./EncodeTexture"; const decompress = (src: Buffer) => { const tim = { @@ -155,44 +110,18 @@ const decompress = (src: Buffer) => { } } - const imageData: number[] = new Array(); - for (ofs = 0; ofs < target.length; ofs++) { - const byte = target.readUInt8(ofs); - imageData.push(byte & 0xf); - imageData.push(byte >> 4); - } - - return imageData; -}; - -const encodeImage = (src: Buffer) => { - const face = PNG.sync.read(src); - const { data, width, height } = face; - - let inOfs = 0; - const pal: number[] = []; - const img: number[] = []; - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x += 2) { - const lowByte = readPixel(data, inOfs, pal); - img.push(lowByte); - inOfs += 4; - const highByte = readPixel(data, inOfs, pal); - img.push(highByte); - inOfs += 4; - } - } - - return { pal, img }; + return target; }; const updateDemoLogo = (pngPath: string) => { const bin = readFileSync("bin/GAME.BIN"); const pngData = readFileSync(pngPath); - // Encode Image - const { pal, img } = encodeImage(pngData); + const imgOfs = 0x041800; + const pal: number[] = []; + + const encodedLogo = encodeCutSceneTexture(pal, pngData); + const encodedTexture = decompress(Buffer.from(bin.subarray(imgOfs))); // Update Palette const palOfs = 0x44800; @@ -200,66 +129,26 @@ const updateDemoLogo = (pngPath: string) => { bin.writeUInt16LE(pal[i], palOfs + 0x30 + i * 2); } - // Update Image - const imgOfs = 0x041800; - // First thing we want to do is get the decompressed texture - const buffer = Buffer.from(bin.subarray(imgOfs)); - const imgData = decompress(buffer); - - // Then we splice in our updated encoded texture - const height = 128; - const width = 256; - let inOfs = 0; - let outOfs = 0; - for (let y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { - if (y >= 64 && y < 104) { - if (x >= 48 && x < 144) { - imgData[outOfs] = img[inOfs]; - inOfs++; - } - } - outOfs++; - } - } + console.log("Encoded Logo: 0x%s", encodedLogo.length.toString(16)); + console.log("Encoded Texture: 0x%s", encodedTexture.length.toString(16)); - // Write the texture to png to confirm it's working' - const png = new PNG({ width, height }); - - let index = 0; - let dst = 0; - for (let y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { - const colorIndex = imgData[index++]; - const { r, g, b, a } = wordToColor(pal[colorIndex!]); - png.data[dst++] = r; - png.data[dst++] = g; - png.data[dst++] = b; - png.data[dst++] = a; + let texOfs = 0x2000; + let logoOfs = 0; + for (let y = 0; y < 40; y++) { + texOfs += 24; + for (let x = 0; x < 48; x++) { + encodedTexture[texOfs++] = encodedLogo[logoOfs++]; } + texOfs += 56; } - // Export file - const dat = PNG.sync.write(png); - writeFileSync(`out/smol.png`, dat); - - // Convert the image data back to a 4bit encoded buffer - const decompressed = Buffer.alloc((width * height) / 2, 0); - - index = 0; - outOfs = 0; - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x += 2) { - const lowByte = imgData[index++]; - const highByte = imgData[index++]; - const byte = ((highByte << 4) | lowByte) & 0xff; - decompressed[outOfs] = byte; - outOfs++; - } - } + console.log("Logo Pos: 0x%s", logoOfs.toString(16)); - // And then we compress and put it back in - const [bodyBitField, compressedBody] = compressData(decompressed); + const [bodyBitField, compressedBody] = compressNewTexture( + Buffer.alloc(0), + encodedTexture, + 0, + ); const len = bodyBitField.length + compressedBody.length; console.log("Segment 2: 0x%s", len.toString(16)); diff --git a/test/logo.test.ts b/test/logo.test.ts index 6c9501a..61bff42 100644 --- a/test/logo.test.ts +++ b/test/logo.test.ts @@ -159,7 +159,7 @@ const renderImage = (src: Buffer, pos: number, palette: Pixel[]) => { // Export file const buffer = PNG.sync.write(png); - writeFileSync(`out/logos_${pos.toString(16)}.png`, buffer); + writeFileSync(`out/miku_${pos.toString(16)}.png`, buffer); }; test("it should search for textures in the file", () => {