@gmvjs/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -35
- package/dist/archives/common.d.ts +9 -9
- package/dist/archives/common.js.map +1 -1
- package/dist/archives/folder.d.ts +1 -1
- package/dist/archives/folder.js +1 -1
- package/dist/archives/folder.js.map +1 -1
- package/dist/archives/zip.js.map +1 -1
- package/dist/binary.d.ts +7 -7
- package/dist/binary.js.map +1 -1
- package/dist/builtin-en.js.map +1 -1
- package/dist/builtin.js +1 -1
- package/dist/builtin.js.map +1 -1
- package/dist/codecs/zlib.d.ts +2 -2
- package/dist/codecs/zlib.js.map +1 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/geometry.d.ts +5 -5
- package/dist/geometry.js.map +1 -1
- package/dist/i18n.d.ts +4 -4
- package/dist/i18n.js.map +1 -1
- package/dist/images/bc45.d.ts +1 -1
- package/dist/images/bc45.js.map +1 -1
- package/dist/images/bc7.d.ts +1 -1
- package/dist/images/bc7.js.map +1 -1
- package/dist/images/dds.d.ts +1 -1
- package/dist/images/dds.js.map +1 -1
- package/dist/images/pcx.js.map +1 -1
- package/dist/images/tga.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/levelbuilder.d.ts +3 -3
- package/dist/levelbuilder.js +1 -1
- package/dist/levelbuilder.js.map +1 -1
- package/dist/math.d.ts +6 -6
- package/dist/math.js.map +1 -1
- package/dist/normals.d.ts +5 -5
- package/dist/normals.js.map +1 -1
- package/dist/plugin.d.ts +57 -57
- package/dist/plugin.js.map +1 -1
- package/dist/registry.d.ts +14 -14
- package/dist/registry.js +13 -13
- package/dist/registry.js.map +1 -1
- package/dist/scene.d.ts +14 -14
- package/dist/scene.js.map +1 -1
- package/dist/session.d.ts +34 -34
- package/dist/session.js +33 -33
- package/dist/session.js.map +1 -1
- package/dist/skeleton.d.ts +3 -3
- package/dist/skeleton.js.map +1 -1
- package/dist/surface.d.ts +4 -4
- package/dist/surface.js.map +1 -1
- package/dist/textures.d.ts +12 -12
- package/dist/textures.js +9 -9
- package/dist/textures.js.map +1 -1
- package/dist/types.d.ts +103 -103
- package/dist/types.js.map +1 -1
- package/dist/writers/dds.d.ts +1 -1
- package/dist/writers/dds.js.map +1 -1
- package/dist/writers/obj.js.map +1 -1
- package/dist/writers/zip.js.map +1 -1
- package/package.json +3 -3
package/dist/images/bc45.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bc45.js","sources":["../../src/images/bc45.ts"],"sourcesContent":["// BC4 (ATI1,
|
|
1
|
+
{"version":3,"file":"bc45.js","sources":["../../src/images/bc45.ts"],"sourcesContent":["// BC4 (ATI1, one channel) and BC5 (ATI2, two channels: normal map XY, Z is reconstructed) to RGBA8.\n\n/** DXT5 alpha block (BC4): 8 bytes -> 16 values. */\nfunction bc4Block(u8: Uint8Array, p: number, out: Uint8Array) {\n const a0 = u8[p]!, a1 = u8[p + 1]!, lut = [a0, a1, 0, 0, 0, 0, 0, 0];\n if (a0 > a1) for (let i = 1; i <= 6; i++) lut[i + 1] = ((7 - i) * a0 + i * a1) / 7 | 0;\n else { for (let i = 1; i <= 4; i++) lut[i + 1] = ((5 - i) * a0 + i * a1) / 5 | 0; lut[6] = 0; lut[7] = 255; }\n let bits = 0, nb = 0, q = p + 2;\n for (let i = 0; i < 16; i++) {\n if (nb < 3) { bits |= u8[q++]! << nb; nb += 8; }\n out[i] = lut[bits & 7]!;\n bits >>>= 3; nb -= 3;\n }\n}\n/** BC4 → grey, BC5 (two) → normal: R, G from the blocks, B = Z. */\nexport function decodeBC45(u8: Uint8Array, off: number, w: number, h: number, two: boolean): Uint8Array {\n const out = new Uint8Array(w * h * 4), r = new Uint8Array(16), g = new Uint8Array(16), bw = (w + 3) >> 2, bh = (h + 3) >> 2;\n let p = off;\n for (let by = 0; by < bh; by++)\n for (let bx = 0; bx < bw; bx++) {\n bc4Block(u8, p, r); p += 8;\n if (two) { bc4Block(u8, p, g); p += 8; }\n for (let i = 0; i < 16; i++) {\n const x = bx * 4 + (i & 3), y = by * 4 + (i >> 2);\n if (x >= w || y >= h) continue;\n const o = (y * w + x) * 4;\n if (two) { out[o] = r[i]!; out[o + 1] = g[i]!; const nx = r[i]! / 127.5 - 1, ny = g[i]! / 127.5 - 1; out[o + 2] = Math.round((Math.sqrt(Math.max(0, 1 - nx * nx - ny * ny)) * 0.5 + 0.5) * 255); }\n else out[o] = out[o + 1] = out[o + 2] = r[i]!;\n out[o + 3] = 255;\n }\n }\n return out;\n}\n"],"names":[],"mappings":"AAGA,SAAS,SAAS,IAAgB,GAAW,KAAiB;AAC5D,QAAM,KAAK,GAAG,CAAC,GAAI,KAAK,GAAG,IAAI,CAAC,GAAI,MAAM,CAAC,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACnE,MAAI,KAAK,GAAI,UAAS,IAAI,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AAAA,OAChF;AAAE,aAAS,IAAI,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AAAG,QAAI,CAAC,IAAI;AAAG,QAAI,CAAC,IAAI;AAAA,EAAK;AAC5G,MAAI,OAAO,GAAG,KAAK,GAAG,IAAI,IAAI;AAC9B,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,KAAK,GAAG;AAAE,cAAQ,GAAG,GAAG,KAAM;AAAI,YAAM;AAAA,IAAG;AAC/C,QAAI,CAAC,IAAI,IAAI,OAAO,CAAC;AACrB,cAAU;AAAG,UAAM;AAAA,EACrB;AACF;AAEO,SAAS,WAAW,IAAgB,KAAa,GAAW,GAAW,KAA0B;AACtG,QAAM,MAAM,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,WAAW,EAAE,GAAG,IAAI,IAAI,WAAW,EAAE,GAAG,KAAM,IAAI,KAAM,GAAG,KAAM,IAAI,KAAM;AAC1H,MAAI,IAAI;AACR,WAAS,KAAK,GAAG,KAAK,IAAI;AACxB,aAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,eAAS,IAAI,GAAG,CAAC;AAAG,WAAK;AACzB,UAAI,KAAK;AAAE,iBAAS,IAAI,GAAG,CAAC;AAAG,aAAK;AAAA,MAAG;AACvC,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAC/C,YAAI,KAAK,KAAK,KAAK,EAAG;AACtB,cAAM,KAAK,IAAI,IAAI,KAAK;AACxB,YAAI,KAAK;AAAE,cAAI,CAAC,IAAI,EAAE,CAAC;AAAI,cAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAAI,gBAAM,KAAK,EAAE,CAAC,IAAK,QAAQ,GAAG,KAAK,EAAE,CAAC,IAAK,QAAQ;AAAG,cAAI,IAAI,CAAC,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC,IAAI,MAAM,OAAO,GAAG;AAAA,QAAG,MAC5L,KAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3C,YAAI,IAAI,CAAC,IAAI;AAAA,MACf;AAAA,IACF;AACF,SAAO;AACT;"}
|
package/dist/images/bc7.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Decode BC7 (w×h) starting at off. */
|
|
2
2
|
export declare function decodeBC7(src: Uint8Array, off: number, w: number, h: number): Uint8Array;
|
package/dist/images/bc7.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bc7.js","sources":["../../src/images/bc7.ts"],"sourcesContent":["// BC7 (BPTC): распаковка блоков 4×4 в RGBA8. Режимы 0–7 по спецификации Direct3D 11.\n\nconst PART2 = [\n 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000,\n 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c,\n 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660,\n 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22,\n];\n// 3 подмножества: индекс подмножества для каждого пикселя (2 бита), 64 разбиения\nconst PART3 = [\n 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250,\n 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200,\n 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600,\n 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254,\n];\nconst ANCHOR2 = [15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15];\nconst ANCHOR3A = [3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3];\nconst ANCHOR3B = [15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8];\nconst W2 = [0, 21, 43, 64], W3 = [0, 9, 18, 27, 37, 46, 55, 64], W4 = [0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64];\nconst WT = [W2, W2, W3, W4] as const;\nconst weights = (bits: number) => (bits === 2 ? W2 : bits === 3 ? W3 : W4);\nvoid WT;\n\n// параметры режимов: подмножества, биты разбиения, вращения, выбора индекса, цвета, альфы, P-биты (ep/shared), индексов, индексов2\nconst MODES = [\n { ns: 3, pb: 4, rb: 0, isb: 0, cb: 4, ab: 0, epb: 1, spb: 0, ib: 3, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 6, ab: 0, epb: 0, spb: 1, ib: 3, ib2: 0 },\n { ns: 3, pb: 6, rb: 0, isb: 0, cb: 5, ab: 0, epb: 0, spb: 0, ib: 2, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 7, ab: 0, epb: 1, spb: 0, ib: 2, ib2: 0 },\n { ns: 1, pb: 0, rb: 2, isb: 1, cb: 5, ab: 6, epb: 0, spb: 0, ib: 2, ib2: 3 },\n { ns: 1, pb: 0, rb: 2, isb: 0, cb: 7, ab: 8, epb: 0, spb: 0, ib: 2, ib2: 2 },\n { ns: 1, pb: 0, rb: 0, isb: 0, cb: 7, ab: 7, epb: 1, spb: 0, ib: 4, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 5, ab: 5, epb: 1, spb: 0, ib: 2, ib2: 0 },\n];\n\nconst EP = new Int32Array(24), IDX = new Uint8Array(16), IDX2 = new Uint8Array(16), WD = new Uint32Array(4);\n\nfunction decodeBlock(src: Uint8Array, off: number, out: Uint8Array /* 64 */): void {\n // 128 бит блока — четыре слова; чтение по n бит младшими первыми\n for (let k = 0; k < 4; k++) WD[k] = (src[off + k * 4]! | (src[off + k * 4 + 1]! << 8) | (src[off + k * 4 + 2]! << 16) | (src[off + k * 4 + 3]! << 24)) >>> 0;\n let bit = 0;\n const get = (n: number): number => {\n if (!n) return 0;\n const w = bit >>> 5, sh = bit & 31;\n let v = WD[w]! >>> sh;\n if (sh + n > 32 && w < 3) v |= WD[w + 1]! << (32 - sh);\n bit += n;\n return (v & ((1 << n) - 1)) >>> 0;\n };\n let mode = 0;\n while (mode < 8 && !get(1)) mode++;\n if (mode >= 8) { out.fill(0); return; }\n const m = MODES[mode]!;\n const part = get(m.pb), rot = get(m.rb), isel = get(m.isb);\n const ns = m.ns, ne = ns * 2, ep = EP;\n for (let e = 0; e < ne; e++) ep[e * 4 + 3] = 255;\n for (let c = 0; c < 3; c++) for (let e = 0; e < ne; e++) ep[e * 4 + c] = get(m.cb);\n if (m.ab) for (let e = 0; e < ne; e++) ep[e * 4 + 3] = get(m.ab);\n // P-биты\n if (m.epb) { for (let e = 0; e < ne; e++) { const p = get(1); for (let c = 0; c < 4; c++) if (c < 3 || m.ab) ep[e * 4 + c] = (ep[e * 4 + c]! << 1) | p; } }\n else if (m.spb) { for (let s = 0; s < ns; s++) { const p = get(1); for (let e = s * 2; e <= s * 2 + 1; e++) for (let c = 0; c < 3; c++) ep[e * 4 + c] = (ep[e * 4 + c]! << 1) | p; } }\n // расширение до 8 бит\n const cbits = m.cb + (m.epb || m.spb ? 1 : 0), abits = m.ab ? m.ab + (m.epb ? 1 : 0) : 0;\n for (let e = 0; e < ne; e++) {\n for (let c = 0; c < 3; c++) ep[e * 4 + c] = (ep[e * 4 + c]! << (8 - cbits)) | (ep[e * 4 + c]! >> (2 * cbits - 8));\n ep[e * 4 + 3] = abits ? (ep[e * 4 + 3]! << (8 - abits)) | (ep[e * 4 + 3]! >> (2 * abits - 8)) : 255;\n }\n const p2 = PART2[part]!, p3 = PART3[part]!, a2 = ANCHOR2[part], a3a = ANCHOR3A[part], a3b = ANCHOR3B[part];\n for (let i = 0; i < 16; i++) {\n const anchor = i === 0 || (ns === 2 && i === a2) || (ns === 3 && (i === a3a || i === a3b));\n IDX[i] = get(anchor ? m.ib - 1 : m.ib);\n }\n if (m.ib2) for (let i = 0; i < 16; i++) IDX2[i] = get(i === 0 ? m.ib2 - 1 : m.ib2);\n const w1 = weights(m.ib), w2 = m.ib2 ? weights(m.ib2) : w1;\n for (let i = 0; i < 16; i++) {\n const s = ns === 1 ? 0 : ns === 2 ? (p2 >> i) & 1 : (p3 >> (i * 2)) & 3, e0 = s * 8, e1 = s * 8 + 4;\n let ci = IDX[i]!, ai = IDX[i]!, cw = w1, aw = w1;\n if (m.ib2) { if (isel) { ci = IDX2[i]!; cw = w2; } else { ai = IDX2[i]!; aw = w2; } }\n const o = i * 4, wc = cw[ci]!, wa = aw[ai]!;\n for (let c = 0; c < 3; c++) out[o + c] = ((64 - wc) * ep[e0 + c]! + wc * ep[e1 + c]! + 32) >> 6;\n out[o + 3] = ((64 - wa) * ep[e0 + 3]! + wa * ep[e1 + 3]! + 32) >> 6;\n if (rot) { const t = out[o + 3]!; out[o + 3] = out[o + rot - 1]!; out[o + rot - 1] = t; }\n }\n}\n\n/** Распаковать BC7 (w×h) начиная с off. */\nexport function decodeBC7(src: Uint8Array, off: number, w: number, h: number): Uint8Array {\n const out = new Uint8Array(w * h * 4), blk = new Uint8Array(64), bw = (w + 3) >> 2, bh = (h + 3) >> 2;\n for (let by = 0; by < bh; by++)\n for (let bx = 0; bx < bw; bx++) {\n decodeBlock(src, off + (by * bw + bx) * 16, blk);\n for (let i = 0; i < 16; i++) {\n const x = bx * 4 + (i & 3), y = by * 4 + (i >> 2);\n if (x < w && y < h) { const o = (y * w + x) * 4, q = i * 4; out[o] = blk[q]!; out[o + 1] = blk[q + 1]!; out[o + 2] = blk[q + 2]!; out[o + 3] = blk[q + 3]!; }\n }\n }\n return out;\n}\n"],"names":[],"mappings":"AAEA,MAAM,QAAQ;AAAA,EACZ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxH;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxH;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxH;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAC1H;AAEA,MAAM,QAAQ;AAAA,EACZ;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EACpL;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EACpL;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EACpL;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AACtL;AACA,MAAM,UAAU,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE;AAC/O,MAAM,WAAW,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AACvO,MAAM,WAAW,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AACvP,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAElI,MAAM,UAAU,CAAC,SAAkB,SAAS,IAAI,KAAK,SAAS,IAAI,KAAK;AAIvE,MAAM,QAAQ;AAAA,EACZ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,EACzE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAA;AAC3E;AAEA,MAAM,KAAK,IAAI,WAAW,EAAE,GAAG,MAAM,IAAI,WAAW,EAAE,GAAG,OAAO,IAAI,WAAW,EAAE,GAAG,KAAK,IAAI,YAAY,CAAC;AAE1G,SAAS,YAAY,KAAiB,KAAa,KAAgC;AAEjF,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,IAAG,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,IAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAM,IAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAM,KAAO,IAAI,MAAM,IAAI,IAAI,CAAC,KAAM,QAAS;AAC3J,MAAI,MAAM;AACV,QAAM,MAAM,CAAC,MAAsB;AACjC,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,IAAI,QAAQ,GAAG,KAAK,MAAM;AAChC,QAAI,IAAI,GAAG,CAAC,MAAO;AACnB,QAAI,KAAK,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAO,KAAK;AACnD,WAAO;AACP,YAAQ,KAAM,KAAK,KAAK,OAAQ;AAAA,EAClC;AACA,MAAI,OAAO;AACX,SAAO,OAAO,KAAK,CAAC,IAAI,CAAC,EAAG;AAC5B,MAAI,QAAQ,GAAG;AAAE,QAAI,KAAK,CAAC;AAAG;AAAA,EAAQ;AACtC,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,OAAO,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG;AACzD,QAAM,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,KAAK;AACnC,WAAS,IAAI,GAAG,IAAI,IAAI,IAAK,IAAG,IAAI,IAAI,CAAC,IAAI;AAC7C,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;AACjF,MAAI,EAAE,GAAI,UAAS,IAAI,GAAG,IAAI,IAAI,IAAK,IAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;AAE/D,MAAI,EAAE,KAAK;AAAE,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAAE,YAAM,IAAI,IAAI,CAAC;AAAG,eAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,IAAK,GAAG,IAAI,IAAI,CAAC,KAAM,IAAK;AAAA,IAAG;AAAA,EAAE,WACjJ,EAAE,KAAK;AAAE,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAAE,YAAM,IAAI,IAAI,CAAC;AAAG,eAAS,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,IAAK,IAAG,IAAI,IAAI,CAAC,IAAK,GAAG,IAAI,IAAI,CAAC,KAAM,IAAK;AAAA,IAAG;AAAA,EAAE;AAErL,QAAM,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK;AACvF,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,IAAG,IAAI,IAAI,CAAC,IAAK,GAAG,IAAI,IAAI,CAAC,KAAO,IAAI,QAAW,GAAG,IAAI,IAAI,CAAC,KAAO,IAAI,QAAQ;AAC9G,OAAG,IAAI,IAAI,CAAC,IAAI,QAAS,GAAG,IAAI,IAAI,CAAC,KAAO,IAAI,QAAW,GAAG,IAAI,IAAI,CAAC,KAAO,IAAI,QAAQ,IAAM;AAAA,EAClG;AACA,QAAM,KAAK,MAAM,IAAI,GAAI,KAAK,MAAM,IAAI,GAAI,KAAK,QAAQ,IAAI,GAAG,MAAM,SAAS,IAAI,GAAG,MAAM,SAAS,IAAI;AACzG,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,SAAS,MAAM,KAAM,OAAO,KAAK,MAAM,MAAQ,OAAO,MAAM,MAAM,OAAO,MAAM;AACrF,QAAI,CAAC,IAAI,IAAI,SAAS,EAAE,KAAK,IAAI,EAAE,EAAE;AAAA,EACvC;AACA,MAAI,EAAE,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,IAAK,MAAK,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,MAAM,IAAI,EAAE,GAAG;AACjF,QAAM,KAAK,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,QAAQ,EAAE,GAAG,IAAI;AACxD,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,IAAI,OAAO,IAAI,IAAI,OAAO,IAAK,MAAM,IAAK,IAAK,MAAO,IAAI,IAAM,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI;AAClG,QAAI,KAAK,IAAI,CAAC,GAAI,KAAK,IAAI,CAAC,GAAI,KAAK,IAAI,KAAK;AAC9C,QAAI,EAAE,KAAK;AAAE,UAAI,MAAM;AAAE,aAAK,KAAK,CAAC;AAAI,aAAK;AAAA,MAAI,OAAO;AAAE,aAAK,KAAK,CAAC;AAAI,aAAK;AAAA,MAAI;AAAA,IAAE;AACpF,UAAM,IAAI,IAAI,GAAG,KAAK,GAAG,EAAE,GAAI,KAAK,GAAG,EAAE;AACzC,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,CAAC,KAAM,KAAK,MAAM,GAAG,KAAK,CAAC,IAAK,KAAK,GAAG,KAAK,CAAC,IAAK,MAAO;AAC9F,QAAI,IAAI,CAAC,KAAM,KAAK,MAAM,GAAG,KAAK,CAAC,IAAK,KAAK,GAAG,KAAK,CAAC,IAAK,MAAO;AAClE,QAAI,KAAK;AAAE,YAAM,IAAI,IAAI,IAAI,CAAC;AAAI,UAAI,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;AAAI,UAAI,IAAI,MAAM,CAAC,IAAI;AAAA,IAAG;AAAA,EAC1F;AACF;AAGO,SAAS,UAAU,KAAiB,KAAa,GAAW,GAAuB;AACxF,QAAM,MAAM,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,WAAW,EAAE,GAAG,KAAM,IAAI,KAAM,GAAG,KAAM,IAAI,KAAM;AACpG,WAAS,KAAK,GAAG,KAAK,IAAI;AACxB,aAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,kBAAY,KAAK,OAAO,KAAK,KAAK,MAAM,IAAI,GAAG;AAC/C,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAC/C,YAAI,IAAI,KAAK,IAAI,GAAG;AAAE,gBAAM,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI;AAAG,cAAI,CAAC,IAAI,IAAI,CAAC;AAAI,cAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAI,cAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAI,cAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAAI;AAAA,MAC9J;AAAA,IACF;AACF,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"bc7.js","sources":["../../src/images/bc7.ts"],"sourcesContent":["// BC7 (BPTC): decoding 4×4 blocks to RGBA8. Modes 0–7 per the Direct3D 11 specification.\n\nconst PART2 = [\n 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000,\n 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c,\n 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660,\n 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22,\n];\n// 3 subsets: subset index for every pixel (2 bits), 64 partitions\nconst PART3 = [\n 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250,\n 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200,\n 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600,\n 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254,\n];\nconst ANCHOR2 = [15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15];\nconst ANCHOR3A = [3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3];\nconst ANCHOR3B = [15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15, 15, 15, 8, 15, 8, 15, 3, 15, 8, 15, 8, 3, 15, 6, 10, 15, 15, 10, 8, 15, 3, 15, 10, 10, 8, 9, 10, 6, 15, 8, 15, 3, 6, 6, 8, 15, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 15, 8];\nconst W2 = [0, 21, 43, 64], W3 = [0, 9, 18, 27, 37, 46, 55, 64], W4 = [0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64];\nconst WT = [W2, W2, W3, W4] as const;\nconst weights = (bits: number) => (bits === 2 ? W2 : bits === 3 ? W3 : W4);\nvoid WT;\n\n// mode parameters: subsets, partition bits, rotation, index selection, color, alpha, P-bits (ep/shared), index bits, secondary index bits\nconst MODES = [\n { ns: 3, pb: 4, rb: 0, isb: 0, cb: 4, ab: 0, epb: 1, spb: 0, ib: 3, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 6, ab: 0, epb: 0, spb: 1, ib: 3, ib2: 0 },\n { ns: 3, pb: 6, rb: 0, isb: 0, cb: 5, ab: 0, epb: 0, spb: 0, ib: 2, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 7, ab: 0, epb: 1, spb: 0, ib: 2, ib2: 0 },\n { ns: 1, pb: 0, rb: 2, isb: 1, cb: 5, ab: 6, epb: 0, spb: 0, ib: 2, ib2: 3 },\n { ns: 1, pb: 0, rb: 2, isb: 0, cb: 7, ab: 8, epb: 0, spb: 0, ib: 2, ib2: 2 },\n { ns: 1, pb: 0, rb: 0, isb: 0, cb: 7, ab: 7, epb: 1, spb: 0, ib: 4, ib2: 0 },\n { ns: 2, pb: 6, rb: 0, isb: 0, cb: 5, ab: 5, epb: 1, spb: 0, ib: 2, ib2: 0 },\n];\n\nconst EP = new Int32Array(24), IDX = new Uint8Array(16), IDX2 = new Uint8Array(16), WD = new Uint32Array(4);\n\nfunction decodeBlock(src: Uint8Array, off: number, out: Uint8Array /* 64 */): void {\n // a block's 128 bits as four words; reading n bits, least significant first\n for (let k = 0; k < 4; k++) WD[k] = (src[off + k * 4]! | (src[off + k * 4 + 1]! << 8) | (src[off + k * 4 + 2]! << 16) | (src[off + k * 4 + 3]! << 24)) >>> 0;\n let bit = 0;\n const get = (n: number): number => {\n if (!n) return 0;\n const w = bit >>> 5, sh = bit & 31;\n let v = WD[w]! >>> sh;\n if (sh + n > 32 && w < 3) v |= WD[w + 1]! << (32 - sh);\n bit += n;\n return (v & ((1 << n) - 1)) >>> 0;\n };\n let mode = 0;\n while (mode < 8 && !get(1)) mode++;\n if (mode >= 8) { out.fill(0); return; }\n const m = MODES[mode]!;\n const part = get(m.pb), rot = get(m.rb), isel = get(m.isb);\n const ns = m.ns, ne = ns * 2, ep = EP;\n for (let e = 0; e < ne; e++) ep[e * 4 + 3] = 255;\n for (let c = 0; c < 3; c++) for (let e = 0; e < ne; e++) ep[e * 4 + c] = get(m.cb);\n if (m.ab) for (let e = 0; e < ne; e++) ep[e * 4 + 3] = get(m.ab);\n // P-bits\n if (m.epb) { for (let e = 0; e < ne; e++) { const p = get(1); for (let c = 0; c < 4; c++) if (c < 3 || m.ab) ep[e * 4 + c] = (ep[e * 4 + c]! << 1) | p; } }\n else if (m.spb) { for (let s = 0; s < ns; s++) { const p = get(1); for (let e = s * 2; e <= s * 2 + 1; e++) for (let c = 0; c < 3; c++) ep[e * 4 + c] = (ep[e * 4 + c]! << 1) | p; } }\n // expansion to 8 bits\n const cbits = m.cb + (m.epb || m.spb ? 1 : 0), abits = m.ab ? m.ab + (m.epb ? 1 : 0) : 0;\n for (let e = 0; e < ne; e++) {\n for (let c = 0; c < 3; c++) ep[e * 4 + c] = (ep[e * 4 + c]! << (8 - cbits)) | (ep[e * 4 + c]! >> (2 * cbits - 8));\n ep[e * 4 + 3] = abits ? (ep[e * 4 + 3]! << (8 - abits)) | (ep[e * 4 + 3]! >> (2 * abits - 8)) : 255;\n }\n const p2 = PART2[part]!, p3 = PART3[part]!, a2 = ANCHOR2[part], a3a = ANCHOR3A[part], a3b = ANCHOR3B[part];\n for (let i = 0; i < 16; i++) {\n const anchor = i === 0 || (ns === 2 && i === a2) || (ns === 3 && (i === a3a || i === a3b));\n IDX[i] = get(anchor ? m.ib - 1 : m.ib);\n }\n if (m.ib2) for (let i = 0; i < 16; i++) IDX2[i] = get(i === 0 ? m.ib2 - 1 : m.ib2);\n const w1 = weights(m.ib), w2 = m.ib2 ? weights(m.ib2) : w1;\n for (let i = 0; i < 16; i++) {\n const s = ns === 1 ? 0 : ns === 2 ? (p2 >> i) & 1 : (p3 >> (i * 2)) & 3, e0 = s * 8, e1 = s * 8 + 4;\n let ci = IDX[i]!, ai = IDX[i]!, cw = w1, aw = w1;\n if (m.ib2) { if (isel) { ci = IDX2[i]!; cw = w2; } else { ai = IDX2[i]!; aw = w2; } }\n const o = i * 4, wc = cw[ci]!, wa = aw[ai]!;\n for (let c = 0; c < 3; c++) out[o + c] = ((64 - wc) * ep[e0 + c]! + wc * ep[e1 + c]! + 32) >> 6;\n out[o + 3] = ((64 - wa) * ep[e0 + 3]! + wa * ep[e1 + 3]! + 32) >> 6;\n if (rot) { const t = out[o + 3]!; out[o + 3] = out[o + rot - 1]!; out[o + rot - 1] = t; }\n }\n}\n\n/** Decode BC7 (w×h) starting at off. */\nexport function decodeBC7(src: Uint8Array, off: number, w: number, h: number): Uint8Array {\n const out = new Uint8Array(w * h * 4), blk = new Uint8Array(64), bw = (w + 3) >> 2, bh = (h + 3) >> 2;\n for (let by = 0; by < bh; by++)\n for (let bx = 0; bx < bw; bx++) {\n decodeBlock(src, off + (by * bw + bx) * 16, blk);\n for (let i = 0; i < 16; i++) {\n const x = bx * 4 + (i & 3), y = by * 4 + (i >> 2);\n if (x < w && y < h) { const o = (y * w + x) * 4, q = i * 4; out[o] = blk[q]!; out[o + 1] = blk[q + 1]!; out[o + 2] = blk[q + 2]!; out[o + 3] = blk[q + 3]!; }\n }\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/images/dds.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import type { DecodedImage } from '../types';
|
|
|
2
2
|
/** 1 — DXT1, 3 — DXT3, 5 — DXT5. */
|
|
3
3
|
export type DxtKind = 1 | 3 | 5;
|
|
4
4
|
export declare function decodeDDS(buf: ArrayBuffer): DecodedImage;
|
|
5
|
-
/**
|
|
5
|
+
/** Decode DXT1/3/5 blocks to RGBA. */
|
|
6
6
|
export declare function decodeDXT(dv: DataView, off: number, w: number, h: number, kind: DxtKind): Uint8Array;
|
package/dist/images/dds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dds.js","sources":["../../src/images/dds.ts"],"sourcesContent":["// DDS: DXT1/3/5 (BC1–3), DX10 (BC1–3, RGBA8/BGRA8), несжатые 16/24/32 бит с масками.\nimport type { DecodedImage } from '../types';\n\n/** 1 — DXT1, 3 — DXT3, 5 — DXT5. */\nexport type DxtKind = 1 | 3 | 5;\n\nfunction maskInfo(m: number): { s: number; max: number } {\n if (!m) return { s: 0, max: 0 };\n let s = 0;\n while (!((m >>> s) & 1)) s++;\n let b = 0;\n while ((m >>> (s + b)) & 1) b++;\n return { s, max: 2 ** b - 1 };\n}\n\nconst cc = (s: string) => s.charCodeAt(0) | (s.charCodeAt(1) << 8) | (s.charCodeAt(2) << 16) | (s.charCodeAt(3) << 24);\n\nexport function decodeDDS(buf: ArrayBuffer): DecodedImage {\n const dv = new DataView(buf);\n if (buf.byteLength < 128 || dv.getUint32(0, true) !== 0x20534444) throw new Error('Не DDS файл');\n const h = dv.getUint32(12, true), w = dv.getUint32(16, true);\n const pfFlags = dv.getUint32(80, true), fourCC = dv.getUint32(84, true), bits = dv.getUint32(88, true);\n let off = 128, kind = 0;\n if (pfFlags & 4) {\n if (fourCC === cc('DXT1')) kind = 1;\n else if (fourCC === cc('DXT2') || fourCC === cc('DXT3')) kind = 3;\n else if (fourCC === cc('DXT4') || fourCC === cc('DXT5')) kind = 5;\n else if (fourCC === cc('DX10')) {\n const f = dv.getUint32(128, true);\n off = 148;\n if (f === 71 || f === 72) kind = 1;\n else if (f === 74 || f === 75) kind = 3;\n else if (f === 77 || f === 78) kind = 5;\n else if (f === 28 || f === 29) kind = -1;\n else if (f === 87 || f === 91) kind = -2;\n else throw new Error('Неподдерживаемый DXGI формат DDS: ' + f);\n } else throw new Error('Неподдерживаемый fourCC DDS');\n }\n if (kind > 0) return { width: w, height: h, rgba: decodeDXT(dv, off, w, h, kind as DxtKind) };\n const out = new Uint8Array(w * h * 4);\n if (kind === -1 || kind === -2) {\n for (let i = 0; i < w * h; i++) {\n const o = off + i * 4;\n const r = dv.getUint8(o), g = dv.getUint8(o + 1), b = dv.getUint8(o + 2), a = dv.getUint8(o + 3);\n out.set(kind === -1 ? [r, g, b, a] : [b, g, r, a], i * 4);\n }\n return { width: w, height: h, rgba: out };\n }\n const bpp = bits >> 3;\n if (bpp === 1) {\n // 8 бит: яркость (L8, DDPF_LUMINANCE — карты блеска MudRunner) или только альфа (A8)\n const alphaOnly = !(pfFlags & 0x20000) && !(pfFlags & 0x40) && !!(pfFlags & 0x2);\n for (let i = 0; i < w * h; i++) { const v = dv.getUint8(off + i); out.set(alphaOnly ? [255, 255, 255, v] : [v, v, v, 255], i * 4); }\n return { width: w, height: h, rgba: out };\n }\n if (![2, 3, 4].includes(bpp)) throw new Error('Неподдерживаемый несжатый DDS (' + bits + ' бит)');\n const rm = dv.getUint32(92, true), gm = dv.getUint32(96, true), bm = dv.getUint32(100, true), am = pfFlags & 1 ? dv.getUint32(104, true) : 0;\n const R = maskInfo(rm), G = maskInfo(gm), B = maskInfo(bm), A = maskInfo(am);\n const sc = (v: number, m: { s: number; max: number }) => (m.max ? Math.round((((v >>> m.s) & m.max) * 255) / m.max) : 255);\n for (let i = 0; i < w * h; i++) {\n let px = 0;\n for (let k = 0; k < bpp; k++) px |= dv.getUint8(off + i * bpp + k) << (8 * k);\n out[i * 4] = sc(px & rm, R);\n out[i * 4 + 1] = sc(px & gm, G);\n out[i * 4 + 2] = sc(px & bm, B);\n out[i * 4 + 3] = A.max ? sc(px & am, A) : 255;\n }\n return { width: w, height: h, rgba: out };\n}\n\n/** Распаковка блоков DXT1/3/5 в RGBA. */\nexport function decodeDXT(dv: DataView, off: number, w: number, h: number, kind: DxtKind): Uint8Array {\n const out = new Uint8Array(w * h * 4), bw = (w + 3) >> 2, bh = (h + 3) >> 2;\n const cr = [0, 0, 0, 0], cg = [0, 0, 0, 0], cb = [0, 0, 0, 0], ca = [255, 255, 255, 255], al = new Uint8Array(16);\n let p = off;\n const c565 = (c: number) => [(((c >> 11) & 31) * 255) / 31 | 0, (((c >> 5) & 63) * 255) / 63 | 0, ((c & 31) * 255) / 31 | 0];\n for (let by = 0; by < bh; by++)\n for (let bx = 0; bx < bw; bx++) {\n if (kind === 3) {\n for (let i = 0; i < 8; i++) { const b = dv.getUint8(p + i); al[2 * i] = (b & 15) * 17; al[2 * i + 1] = (b >> 4) * 17; }\n p += 8;\n } else if (kind === 5) {\n const a0 = dv.getUint8(p), a1 = dv.getUint8(p + 1), lut = [a0, a1, 0, 0, 0, 0, 0, 0];\n if (a0 > a1) for (let i = 1; i <= 6; i++) lut[i + 1] = ((7 - i) * a0 + i * a1) / 7 | 0;\n else { for (let i = 1; i <= 4; i++) lut[i + 1] = ((5 - i) * a0 + i * a1) / 5 | 0; lut[6] = 0; lut[7] = 255; }\n const lo = dv.getUint32(p + 2, true), hi = dv.getUint16(p + 6, true);\n for (let i = 0; i < 16; i++) {\n const bit = i * 3;\n let idx: number;\n if (bit <= 29) idx = (lo >>> bit) & 7;\n else if (bit === 30) idx = ((lo >>> 30) | (hi << 2)) & 7;\n else idx = (hi >>> (bit - 32)) & 7;\n al[i] = lut[idx]!;\n }\n p += 8;\n }\n const c0 = dv.getUint16(p, true), c1 = dv.getUint16(p + 2, true), bits = dv.getUint32(p + 4, true);\n p += 8;\n const k0 = c565(c0), k1 = c565(c1);\n for (let k = 0; k < 3; k++) {\n const arr = [cr, cg, cb][k]!;\n arr[0] = k0[k]!; arr[1] = k1[k]!;\n if (kind > 1 || c0 > c1) { arr[2] = (2 * k0[k]! + k1[k]!) / 3 | 0; arr[3] = (k0[k]! + 2 * k1[k]!) / 3 | 0; }\n else { arr[2] = (k0[k]! + k1[k]!) >> 1; arr[3] = 0; }\n }\n ca[3] = kind === 1 && c0 <= c1 ? 0 : 255;\n for (let py = 0; py < 4; py++)\n for (let px = 0; px < 4; px++) {\n const x = bx * 4 + px, y = by * 4 + py;\n if (x >= w || y >= h) continue;\n const idx = (bits >>> (2 * (py * 4 + px))) & 3, o = (y * w + x) * 4;\n out[o] = cr[idx]!; out[o + 1] = cg[idx]!; out[o + 2] = cb[idx]!;\n out[o + 3] = kind === 1 ? ca[idx]! : al[py * 4 + px]!;\n }\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dds.js","sources":["../../src/images/dds.ts"],"sourcesContent":["// DDS: DXT1/3/5 (BC1–3), DX10 (BC1–3, RGBA8/BGRA8), uncompressed 16/24/32-bit with masks.\nimport type { DecodedImage } from '../types';\n\n/** 1 — DXT1, 3 — DXT3, 5 — DXT5. */\nexport type DxtKind = 1 | 3 | 5;\n\nfunction maskInfo(m: number): { s: number; max: number } {\n if (!m) return { s: 0, max: 0 };\n let s = 0;\n while (!((m >>> s) & 1)) s++;\n let b = 0;\n while ((m >>> (s + b)) & 1) b++;\n return { s, max: 2 ** b - 1 };\n}\n\nconst cc = (s: string) => s.charCodeAt(0) | (s.charCodeAt(1) << 8) | (s.charCodeAt(2) << 16) | (s.charCodeAt(3) << 24);\n\nexport function decodeDDS(buf: ArrayBuffer): DecodedImage {\n const dv = new DataView(buf);\n if (buf.byteLength < 128 || dv.getUint32(0, true) !== 0x20534444) throw new Error('Не DDS файл');\n const h = dv.getUint32(12, true), w = dv.getUint32(16, true);\n const pfFlags = dv.getUint32(80, true), fourCC = dv.getUint32(84, true), bits = dv.getUint32(88, true);\n let off = 128, kind = 0;\n if (pfFlags & 4) {\n if (fourCC === cc('DXT1')) kind = 1;\n else if (fourCC === cc('DXT2') || fourCC === cc('DXT3')) kind = 3;\n else if (fourCC === cc('DXT4') || fourCC === cc('DXT5')) kind = 5;\n else if (fourCC === cc('DX10')) {\n const f = dv.getUint32(128, true);\n off = 148;\n if (f === 71 || f === 72) kind = 1;\n else if (f === 74 || f === 75) kind = 3;\n else if (f === 77 || f === 78) kind = 5;\n else if (f === 28 || f === 29) kind = -1;\n else if (f === 87 || f === 91) kind = -2;\n else throw new Error('Неподдерживаемый DXGI формат DDS: ' + f);\n } else throw new Error('Неподдерживаемый fourCC DDS');\n }\n if (kind > 0) return { width: w, height: h, rgba: decodeDXT(dv, off, w, h, kind as DxtKind) };\n const out = new Uint8Array(w * h * 4);\n if (kind === -1 || kind === -2) {\n for (let i = 0; i < w * h; i++) {\n const o = off + i * 4;\n const r = dv.getUint8(o), g = dv.getUint8(o + 1), b = dv.getUint8(o + 2), a = dv.getUint8(o + 3);\n out.set(kind === -1 ? [r, g, b, a] : [b, g, r, a], i * 4);\n }\n return { width: w, height: h, rgba: out };\n }\n const bpp = bits >> 3;\n if (bpp === 1) {\n // 8-bit: luminance (L8, DDPF_LUMINANCE — MudRunner gloss maps) or alpha only (A8)\n const alphaOnly = !(pfFlags & 0x20000) && !(pfFlags & 0x40) && !!(pfFlags & 0x2);\n for (let i = 0; i < w * h; i++) { const v = dv.getUint8(off + i); out.set(alphaOnly ? [255, 255, 255, v] : [v, v, v, 255], i * 4); }\n return { width: w, height: h, rgba: out };\n }\n if (![2, 3, 4].includes(bpp)) throw new Error('Неподдерживаемый несжатый DDS (' + bits + ' бит)');\n const rm = dv.getUint32(92, true), gm = dv.getUint32(96, true), bm = dv.getUint32(100, true), am = pfFlags & 1 ? dv.getUint32(104, true) : 0;\n const R = maskInfo(rm), G = maskInfo(gm), B = maskInfo(bm), A = maskInfo(am);\n const sc = (v: number, m: { s: number; max: number }) => (m.max ? Math.round((((v >>> m.s) & m.max) * 255) / m.max) : 255);\n for (let i = 0; i < w * h; i++) {\n let px = 0;\n for (let k = 0; k < bpp; k++) px |= dv.getUint8(off + i * bpp + k) << (8 * k);\n out[i * 4] = sc(px & rm, R);\n out[i * 4 + 1] = sc(px & gm, G);\n out[i * 4 + 2] = sc(px & bm, B);\n out[i * 4 + 3] = A.max ? sc(px & am, A) : 255;\n }\n return { width: w, height: h, rgba: out };\n}\n\n/** Decode DXT1/3/5 blocks to RGBA. */\nexport function decodeDXT(dv: DataView, off: number, w: number, h: number, kind: DxtKind): Uint8Array {\n const out = new Uint8Array(w * h * 4), bw = (w + 3) >> 2, bh = (h + 3) >> 2;\n const cr = [0, 0, 0, 0], cg = [0, 0, 0, 0], cb = [0, 0, 0, 0], ca = [255, 255, 255, 255], al = new Uint8Array(16);\n let p = off;\n const c565 = (c: number) => [(((c >> 11) & 31) * 255) / 31 | 0, (((c >> 5) & 63) * 255) / 63 | 0, ((c & 31) * 255) / 31 | 0];\n for (let by = 0; by < bh; by++)\n for (let bx = 0; bx < bw; bx++) {\n if (kind === 3) {\n for (let i = 0; i < 8; i++) { const b = dv.getUint8(p + i); al[2 * i] = (b & 15) * 17; al[2 * i + 1] = (b >> 4) * 17; }\n p += 8;\n } else if (kind === 5) {\n const a0 = dv.getUint8(p), a1 = dv.getUint8(p + 1), lut = [a0, a1, 0, 0, 0, 0, 0, 0];\n if (a0 > a1) for (let i = 1; i <= 6; i++) lut[i + 1] = ((7 - i) * a0 + i * a1) / 7 | 0;\n else { for (let i = 1; i <= 4; i++) lut[i + 1] = ((5 - i) * a0 + i * a1) / 5 | 0; lut[6] = 0; lut[7] = 255; }\n const lo = dv.getUint32(p + 2, true), hi = dv.getUint16(p + 6, true);\n for (let i = 0; i < 16; i++) {\n const bit = i * 3;\n let idx: number;\n if (bit <= 29) idx = (lo >>> bit) & 7;\n else if (bit === 30) idx = ((lo >>> 30) | (hi << 2)) & 7;\n else idx = (hi >>> (bit - 32)) & 7;\n al[i] = lut[idx]!;\n }\n p += 8;\n }\n const c0 = dv.getUint16(p, true), c1 = dv.getUint16(p + 2, true), bits = dv.getUint32(p + 4, true);\n p += 8;\n const k0 = c565(c0), k1 = c565(c1);\n for (let k = 0; k < 3; k++) {\n const arr = [cr, cg, cb][k]!;\n arr[0] = k0[k]!; arr[1] = k1[k]!;\n if (kind > 1 || c0 > c1) { arr[2] = (2 * k0[k]! + k1[k]!) / 3 | 0; arr[3] = (k0[k]! + 2 * k1[k]!) / 3 | 0; }\n else { arr[2] = (k0[k]! + k1[k]!) >> 1; arr[3] = 0; }\n }\n ca[3] = kind === 1 && c0 <= c1 ? 0 : 255;\n for (let py = 0; py < 4; py++)\n for (let px = 0; px < 4; px++) {\n const x = bx * 4 + px, y = by * 4 + py;\n if (x >= w || y >= h) continue;\n const idx = (bits >>> (2 * (py * 4 + px))) & 3, o = (y * w + x) * 4;\n out[o] = cr[idx]!; out[o + 1] = cg[idx]!; out[o + 2] = cb[idx]!;\n out[o + 3] = kind === 1 ? ca[idx]! : al[py * 4 + px]!;\n }\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/images/pcx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcx.js","sources":["../../src/images/pcx.ts"],"sourcesContent":["// PCX (Quake II): 8
|
|
1
|
+
{"version":3,"file":"pcx.js","sources":["../../src/images/pcx.ts"],"sourcesContent":["// PCX (Quake II): 8-bit with a palette at the end of the file or 24-bit (3 planes), RLE.\nimport type { DecodedImage } from '../types';\n\nexport function decodePCX(buf: ArrayBuffer): DecodedImage {\n const u8 = new Uint8Array(buf), dv = new DataView(buf);\n if (u8[0] !== 10 || u8[2] !== 1 || u8[3] !== 8) throw new Error('PCX: неподдерживаемый формат');\n const w = dv.getUint16(8, true) - dv.getUint16(4, true) + 1, h = dv.getUint16(10, true) - dv.getUint16(6, true) + 1;\n const planes = u8[65]!, bpl = dv.getUint16(66, true);\n const line = planes * bpl, data = new Uint8Array(line * h);\n let p = 128;\n for (let i = 0; i < data.length && p < u8.length;) {\n let c = u8[p++]!, n = 1;\n if ((c & 0xc0) === 0xc0) { n = c & 0x3f; c = u8[p++]!; }\n while (n-- > 0 && i < data.length) data[i++] = c;\n }\n const out = new Uint8Array(w * h * 4);\n const pal = planes === 1 && u8[u8.length - 769] === 12 ? u8.subarray(u8.length - 768) : null;\n for (let y = 0; y < h; y++)\n for (let x = 0; x < w; x++) {\n const d = (y * w + x) * 4;\n let r: number, g: number, b: number;\n if (planes === 1) {\n const v = data[y * line + x]!;\n if (pal) { r = pal[v * 3]!; g = pal[v * 3 + 1]!; b = pal[v * 3 + 2]!; } else r = g = b = v;\n } else { r = data[y * line + x]!; g = data[y * line + bpl + x]!; b = data[y * line + 2 * bpl + x]!; }\n out[d] = r; out[d + 1] = g; out[d + 2] = b; out[d + 3] = 255;\n }\n return { width: w, height: h, rgba: out };\n}\n"],"names":[],"mappings":"AAGO,SAAS,UAAU,KAAgC;AACxD,QAAM,KAAK,IAAI,WAAW,GAAG,GAAG,KAAK,IAAI,SAAS,GAAG;AACrD,MAAI,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAG,OAAM,IAAI,MAAM,8BAA8B;AAC9F,QAAM,IAAI,GAAG,UAAU,GAAG,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,UAAU,IAAI,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,IAAI;AAClH,QAAM,SAAS,GAAG,EAAE,GAAI,MAAM,GAAG,UAAU,IAAI,IAAI;AACnD,QAAM,OAAO,SAAS,KAAK,OAAO,IAAI,WAAW,OAAO,CAAC;AACzD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,UAAU,IAAI,GAAG,UAAS;AACjD,QAAI,IAAI,GAAG,GAAG,GAAI,IAAI;AACtB,SAAK,IAAI,SAAU,KAAM;AAAE,UAAI,IAAI;AAAM,UAAI,GAAG,GAAG;AAAA,IAAI;AACvD,WAAO,MAAM,KAAK,IAAI,KAAK,OAAQ,MAAK,GAAG,IAAI;AAAA,EACjD;AACA,QAAM,MAAM,IAAI,WAAW,IAAI,IAAI,CAAC;AACpC,QAAM,MAAM,WAAW,KAAK,GAAG,GAAG,SAAS,GAAG,MAAM,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI;AACxF,WAAS,IAAI,GAAG,IAAI,GAAG;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,IAAI,KAAK;AACxB,UAAI,GAAW,GAAW;AAC1B,UAAI,WAAW,GAAG;AAChB,cAAM,IAAI,KAAK,IAAI,OAAO,CAAC;AAC3B,YAAI,KAAK;AAAE,cAAI,IAAI,IAAI,CAAC;AAAI,cAAI,IAAI,IAAI,IAAI,CAAC;AAAI,cAAI,IAAI,IAAI,IAAI,CAAC;AAAA,QAAI,MAAO,KAAI,IAAI,IAAI;AAAA,MAC3F,OAAO;AAAE,YAAI,KAAK,IAAI,OAAO,CAAC;AAAI,YAAI,KAAK,IAAI,OAAO,MAAM,CAAC;AAAI,YAAI,KAAK,IAAI,OAAO,IAAI,MAAM,CAAC;AAAA,MAAI;AACpG,UAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAA,IAC3D;AACF,SAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAA;AACtC;"}
|
package/dist/images/tga.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tga.js","sources":["../../src/images/tga.ts"],"sourcesContent":["// TGA: truecolor / grayscale / colormap,
|
|
1
|
+
{"version":3,"file":"tga.js","sources":["../../src/images/tga.ts"],"sourcesContent":["// TGA: truecolor / grayscale / colormap, with and without RLE; orientation from bit 5 of the descriptor.\nimport type { DecodedImage } from '../types';\n\nexport function decodeTGA(buf: ArrayBuffer): DecodedImage {\n const u8 = new Uint8Array(buf), dv = new DataView(buf);\n if (buf.byteLength < 18) throw new Error('TGA: файл слишком короткий');\n const idLen = u8[0]!, cmType = u8[1]!, type = u8[2]!, cmLen = dv.getUint16(5, true), cmBits = u8[7]!;\n const w = dv.getUint16(12, true), h = dv.getUint16(14, true), bpp = u8[16]!, top = (u8[17]! & 0x20) !== 0;\n if (![1, 2, 3, 9, 10, 11].includes(type) || !w || !h) throw new Error('TGA: неподдерживаемый тип ' + type);\n let p = 18 + idLen, pal: Uint8Array | null = null;\n const cmBytes = cmBits >> 3;\n if (cmType === 1) { pal = u8.subarray(p, p + cmLen * cmBytes); p += cmLen * cmBytes; }\n const bp = bpp >> 3, raw = new Uint8Array(w * h * bp), rle = type >= 9;\n if (!rle) raw.set(u8.subarray(p, p + raw.length));\n else\n for (let i = 0; i < raw.length;) {\n const c = u8[p++]!, n = (c & 0x7f) + 1;\n if (c & 0x80) { for (let k = 0; k < n && i < raw.length; k++) for (let b = 0; b < bp; b++) raw[i++] = u8[p + b]!; p += bp; }\n else for (let k = 0; k < n * bp && i < raw.length; k++) raw[i++] = u8[p++]!;\n }\n const out = new Uint8Array(w * h * 4);\n for (let y = 0; y < h; y++) {\n const dy = top ? y : h - 1 - y;\n for (let x = 0; x < w; x++) {\n const s = (y * w + x) * bp, d = (dy * w + x) * 4;\n let r: number, g: number, b: number, a = 255;\n if (pal) { const q = raw[s]! * cmBytes; b = pal[q]!; g = pal[q + 1]!; r = pal[q + 2]!; if (cmBytes === 4) a = pal[q + 3]!; }\n else if (bp === 1) r = g = b = raw[s]!;\n else if (bp === 2) { const v = raw[s]! | (raw[s + 1]! << 8); r = (((v >> 10) & 31) * 255) / 31; g = (((v >> 5) & 31) * 255) / 31; b = ((v & 31) * 255) / 31; }\n else { b = raw[s]!; g = raw[s + 1]!; r = raw[s + 2]!; if (bp === 4) a = raw[s + 3]!; }\n out[d] = r; out[d + 1] = g; out[d + 2] = b; out[d + 3] = a;\n }\n }\n return { width: w, height: h, rgba: out };\n}\n"],"names":[],"mappings":"AAGO,SAAS,UAAU,KAAgC;AACxD,QAAM,KAAK,IAAI,WAAW,GAAG,GAAG,KAAK,IAAI,SAAS,GAAG;AACrD,MAAI,IAAI,aAAa,GAAI,OAAM,IAAI,MAAM,4BAA4B;AACrE,QAAM,QAAQ,GAAG,CAAC,GAAI,SAAS,GAAG,CAAC,GAAI,OAAO,GAAG,CAAC,GAAI,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC;AAClG,QAAM,IAAI,GAAG,UAAU,IAAI,IAAI,GAAG,IAAI,GAAG,UAAU,IAAI,IAAI,GAAG,MAAM,GAAG,EAAE,GAAI,OAAO,GAAG,EAAE,IAAK,QAAU;AACxG,MAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,+BAA+B,IAAI;AACzG,MAAI,IAAI,KAAK,OAAO,MAAyB;AAC7C,QAAM,UAAU,UAAU;AAC1B,MAAI,WAAW,GAAG;AAAE,UAAM,GAAG,SAAS,GAAG,IAAI,QAAQ,OAAO;AAAG,SAAK,QAAQ;AAAA,EAAS;AACrF,QAAM,KAAK,OAAO,GAAG,MAAM,IAAI,WAAW,IAAI,IAAI,EAAE,GAAG,MAAM,QAAQ;AACrE,MAAI,CAAC,IAAK,KAAI,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA;AAE9C,aAAS,IAAI,GAAG,IAAI,IAAI,UAAS;AAC/B,YAAM,IAAI,GAAG,GAAG,GAAI,KAAK,IAAI,OAAQ;AACrC,UAAI,IAAI,KAAM;AAAE,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,IAAK,KAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAAI,aAAK;AAAA,MAAI,MACtH,UAAS,IAAI,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,QAAQ,IAAK,KAAI,GAAG,IAAI,GAAG,GAAG;AAAA,IAC3E;AACF,QAAM,MAAM,IAAI,WAAW,IAAI,IAAI,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,MAAM,IAAI,IAAI,IAAI;AAC7B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK;AAC/C,UAAI,GAAW,GAAW,GAAW,IAAI;AACzC,UAAI,KAAK;AAAE,cAAM,IAAI,IAAI,CAAC,IAAK;AAAS,YAAI,IAAI,CAAC;AAAI,YAAI,IAAI,IAAI,CAAC;AAAI,YAAI,IAAI,IAAI,CAAC;AAAI,YAAI,YAAY,EAAG,KAAI,IAAI,IAAI,CAAC;AAAA,MAAI,WAClH,OAAO,OAAO,IAAI,IAAI,IAAI,CAAC;AAAA,eAC3B,OAAO,GAAG;AAAE,cAAM,IAAI,IAAI,CAAC,IAAM,IAAI,IAAI,CAAC,KAAM;AAAI,aAAO,KAAK,KAAM,MAAM,MAAO;AAAI,aAAO,KAAK,IAAK,MAAM,MAAO;AAAI,aAAM,IAAI,MAAM,MAAO;AAAA,MAAI,OACxJ;AAAE,YAAI,IAAI,CAAC;AAAI,YAAI,IAAI,IAAI,CAAC;AAAI,YAAI,IAAI,IAAI,CAAC;AAAI,YAAI,OAAO,EAAG,KAAI,IAAI,IAAI,CAAC;AAAA,MAAI;AACrF,UAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAG,UAAI,IAAI,CAAC,IAAI;AAAA,IAC3D;AAAA,EACF;AACA,SAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAA;AACtC;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,5 +26,5 @@ export * as geometry from './geometry';
|
|
|
26
26
|
export * as binary from './binary';
|
|
27
27
|
import { Registry } from './registry';
|
|
28
28
|
import type { EnginePlugin } from './plugin';
|
|
29
|
-
/**
|
|
29
|
+
/** Registry with the built-in core and the given engines. */
|
|
30
30
|
export declare function createRegistry(engines?: readonly EnginePlugin[]): Registry;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["// gmv
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["// gmv: core of the game model viewer — types, plugin registry, format detection, archives, codecs, session.\n// Engines are separate packages: `import { xrayV1Engine } from '@gmvjs/xray-v1'`, one game: `@gmvjs/xray-v1/cop`, all: `@gmvjs/all`.\nexport * from './types';\nexport * from './plugin';\nexport { setLocale, getLocale, tr, presetText, engineTitle, exporterText, type Locale } from './i18n';\nexport { Registry, type Detection } from './registry';\nexport { ViewerSession, loadSameDirMotions, errMsg, type SessionEvents, type TextureResult, type NormalResult, type SurfaceResult, type ArchiveItem } from './session';\nexport { analyzeNormalMap, computeTangents, normalCandidates, type NormalPacking } from './normals';\nexport { composeSurface, surfaceCandidates, surfaceMaps } from './surface';\nexport { TextureLibrary, type TextureSource, type ImageDecoder } from './textures';\nexport { buildDiagnostics, hexDump, type DiagnosticsInput } from './diagnostics';\nexport { NodeSkeleton, type SkeletonNode } from './skeleton';\nexport { sceneTree, sceneLeaves, applyPlacement, rotatePlacement, translatePlacement, visibleIndices, instanceAt, pickRay, type SceneNode, type RayHit } from './scene';\nexport { coreEngine } from './builtin';\nexport { createArchive, readRange, TEXTURE_RE, type ArchiveSpec } from './archives/common';\nexport { openFolder } from './archives/folder';\nexport { openZip } from './archives/zip';\nexport { inflateZlib, inflateRaw } from './codecs/zlib';\nexport { decodeDDS, decodeDXT, type DxtKind } from './images/dds';\nexport { decodeBC45 } from './images/bc45';\nexport { decodeBC7 } from './images/bc7';\nexport { encodeDdsRgba } from './writers/dds';\nexport { writeZip, crc32 } from './writers/zip';\nexport { decodeTGA } from './images/tga';\nexport { decodePCX } from './images/pcx';\nexport * as math from './math';\nexport * as geometry from './geometry';\nexport * as binary from './binary';\n\nimport { Registry } from './registry';\nimport { coreEngine } from './builtin';\nimport type { EnginePlugin } from './plugin';\n\n/** Registry with the built-in core and the given engines. */\nexport function createRegistry(engines: readonly EnginePlugin[] = []): Registry {\n return new Registry([coreEngine, ...engines.filter((e) => e.id !== 'core')]);\n}\n"],"names":["Registry","coreEngine"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAkCO,SAAS,eAAe,UAAmC,IAAc;AAC9E,SAAO,IAAIA,SAAS,CAACC,YAAY,GAAG,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAC7E;"}
|
package/dist/levelbuilder.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { InstancedScene, Mesh } from './types';
|
|
2
|
-
/**
|
|
2
|
+
/** Diamond marker (lights, particles): 6 vertices, 8 faces. */
|
|
3
3
|
export declare function markerMesh(name: string, size: number, color: number[]): Mesh;
|
|
4
4
|
interface Group {
|
|
5
5
|
index: number;
|
|
@@ -15,14 +15,14 @@ interface Group {
|
|
|
15
15
|
flip: boolean;
|
|
16
16
|
}>;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
18
|
+
/** Scene builder: instances are merged into shared meshes by material; arrays are allocated once at the end. */
|
|
19
19
|
export declare class LevelBuilder {
|
|
20
20
|
readonly groups: Map<string, Group>;
|
|
21
21
|
readonly scene: InstancedScene;
|
|
22
22
|
private readonly protoParts;
|
|
23
23
|
tris: number;
|
|
24
24
|
private group;
|
|
25
|
-
/**
|
|
25
|
+
/** Prototype: model parts; kind is the group key prefix (grass separate from static geometry so it can be hidden). */
|
|
26
26
|
proto(name: string, parts: Mesh[], kind: string, label: (p: Mesh) => string, hidden?: boolean): number;
|
|
27
27
|
private groupsByIndex;
|
|
28
28
|
place(pi: number, parts: Mesh[], M: ArrayLike<number>, name: string, layer: string): void;
|
package/dist/levelbuilder.js
CHANGED
|
@@ -17,7 +17,7 @@ class LevelBuilder {
|
|
|
17
17
|
}
|
|
18
18
|
return g;
|
|
19
19
|
}
|
|
20
|
-
/**
|
|
20
|
+
/** Prototype: model parts; kind is the group key prefix (grass separate from static geometry so it can be hidden). */
|
|
21
21
|
proto(name, parts, kind, label, hidden = false) {
|
|
22
22
|
const gs = parts.map((p) => this.group(`${kind}|${p.texture}|${p.material ?? ""}|${p.color?.join(",") ?? ""}`, label(p), p, hidden));
|
|
23
23
|
this.protoParts.push(gs.map((g) => g.index));
|
package/dist/levelbuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"levelbuilder.js","sources":["../src/levelbuilder.ts"],"sourcesContent":["//
|
|
1
|
+
{"version":3,"file":"levelbuilder.js","sources":["../src/levelbuilder.ts"],"sourcesContent":["// Building a level from model instances: instances are merged into shared meshes by material (arrays are allocated once at the end),\n// the InstancedScene keeps prototypes and placements (for selecting and hiding objects).\nimport type { InstancedScene, Mesh, PlacementRange } from './types';\n\n/** Diamond marker (lights, particles): 6 vertices, 8 faces. */\nexport function markerMesh(name: string, size: number, color: number[]): Mesh {\n const s = size, P = [s, 0, 0, -s, 0, 0, 0, s, 0, 0, -s, 0, 0, 0, s, 0, 0, -s];\n const I = [0, 2, 4, 2, 1, 4, 1, 3, 4, 3, 0, 4, 2, 0, 5, 1, 2, 5, 3, 1, 5, 0, 3, 5];\n const pos = Float32Array.from(P), nor = Float32Array.from(P.map((v) => Math.sign(v)));\n return { name, texture: '', vertexCount: 6, pos, nor, uv: new Float32Array(12), bone: new Float32Array(0), weight: new Float32Array(0), indices: Uint16Array.from(I), skinned: false, color };\n}\n\ninterface Group { index: number; key: string; name: string; proto: Mesh; hidden: boolean; nV: number; nI: number; items: Array<{ p: Mesh; M: ArrayLike<number>; flip: boolean }> }\n\n/** Scene builder: instances are merged into shared meshes by material; arrays are allocated once at the end. */\nexport class LevelBuilder {\n readonly groups = new Map<string, Group>();\n readonly scene: InstancedScene = { meshes: [], protos: [], placements: [] };\n private readonly protoParts: number[][] = [];\n tris = 0;\n\n private group(key: string, name: string, p: Mesh, hidden: boolean): Group {\n let g = this.groups.get(key);\n if (!g) { g = { index: this.groups.size, key, name, proto: p, hidden, nV: 0, nI: 0, items: [] }; this.groups.set(key, g); }\n return g;\n }\n\n /** Prototype: model parts; kind is the group key prefix (grass separate from static geometry so it can be hidden). */\n proto(name: string, parts: Mesh[], kind: string, label: (p: Mesh) => string, hidden = false): number {\n const gs = parts.map((p) => this.group(`${kind}|${p.texture}|${p.material ?? ''}|${p.color?.join(',') ?? ''}`, label(p), p, hidden));\n this.protoParts.push(gs.map((g) => g.index));\n this.scene.protos.push({ name, parts: parts.map((p, i) => ({ mesh: gs[i]!.index, pos: p.pos, nor: p.nor, uv: p.uv, indices: Uint32Array.from(p.indices) })) });\n this.groupsByIndex = null;\n return this.scene.protos.length - 1;\n }\n\n private groupsByIndex: Group[] | null = null;\n\n place(pi: number, parts: Mesh[], M: ArrayLike<number>, name: string, layer: string): void {\n const byIndex = (this.groupsByIndex ??= [...this.groups.values()]);\n const det = M[0]! * (M[5]! * M[10]! - M[6]! * M[9]!) - M[1]! * (M[4]! * M[10]! - M[6]! * M[8]!) + M[2]! * (M[4]! * M[9]! - M[5]! * M[8]!);\n const ranges: PlacementRange[] = [];\n this.protoParts[pi]!.forEach((gi, partIndex) => {\n const g = byIndex[gi]!, p = parts[partIndex]!;\n ranges.push({ mesh: gi, part: partIndex, vStart: g.nV, vCount: p.vertexCount, iStart: g.nI, iCount: p.indices.length });\n g.items.push({ p, M, flip: det < 0 });\n g.nV += p.vertexCount; g.nI += p.indices.length;\n this.tris += p.indices.length / 3;\n });\n this.scene.placements.push({ proto: pi, name, pose: Array.from(M), group: layer, ranges });\n }\n\n build(): Mesh[] {\n const meshes: Mesh[] = [];\n for (const g of this.groups.values()) {\n const pos = new Float32Array(g.nV * 3), nor = new Float32Array(g.nV * 3), uv = new Float32Array(g.nV * 2);\n const indices = g.nV > 65535 ? new Uint32Array(g.nI) : new Uint16Array(g.nI);\n let v0 = 0, i0 = 0;\n for (const { p, M, flip } of g.items) {\n const n = p.vertexCount;\n for (let i = 0; i < n; i++) {\n const x = p.pos[i * 3]!, y = p.pos[i * 3 + 1]!, z = p.pos[i * 3 + 2]!, o = (v0 + i) * 3;\n pos[o] = x * M[0]! + y * M[4]! + z * M[8]! + M[12]!; pos[o + 1] = x * M[1]! + y * M[5]! + z * M[9]! + M[13]!; pos[o + 2] = x * M[2]! + y * M[6]! + z * M[10]! + M[14]!;\n const nx = p.nor[i * 3]!, ny = p.nor[i * 3 + 1]!, nz = p.nor[i * 3 + 2]!;\n const ax = nx * M[0]! + ny * M[4]! + nz * M[8]!, ay = nx * M[1]! + ny * M[5]! + nz * M[9]!, az = nx * M[2]! + ny * M[6]! + nz * M[10]!, l = Math.hypot(ax, ay, az) || 1;\n nor[o] = ax / l; nor[o + 1] = ay / l; nor[o + 2] = az / l;\n uv[(v0 + i) * 2] = p.uv[i * 2]!; uv[(v0 + i) * 2 + 1] = p.uv[i * 2 + 1]!;\n }\n const idx = p.indices;\n for (let i = 0; i + 2 < idx.length; i += 3) {\n indices[i0 + i] = v0 + idx[i]!;\n indices[i0 + i + 1] = v0 + idx[flip ? i + 2 : i + 1]!;\n indices[i0 + i + 2] = v0 + idx[flip ? i + 1 : i + 2]!;\n }\n v0 += n; i0 += idx.length;\n }\n g.items = [];\n const P = g.proto;\n meshes.push({\n name: g.name, texture: P.texture, material: P.material, normalMap: P.normalMap, surface: P.surface, color: P.color, alphaTest: P.alphaTest, ...(P.image ? { image: P.image } : {}), ...(P.screenFx ? { screenFx: P.screenFx } : {}),\n vertexCount: g.nV, pos, nor, uv, bone: new Float32Array(0), weight: new Float32Array(0), indices, skinned: false, ...(g.hidden ? { defaultHidden: true } : {}),\n });\n }\n this.scene.meshes = meshes.map((_, i) => i);\n return meshes;\n }\n}\n\n"],"names":[],"mappings":"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"}
|
package/dist/math.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export type Mat4 = Float64Array | Float32Array;
|
|
2
2
|
export declare function identity(): Float64Array;
|
|
3
|
-
/** a·b (column-major),
|
|
3
|
+
/** a·b (column-major), result in a new array. */
|
|
4
4
|
export declare function mulCol(a: ArrayLike<number>, b: ArrayLike<number>): Float64Array;
|
|
5
5
|
export declare function mulColInto(a: ArrayLike<number>, b: ArrayLike<number>, o: Mat4): void;
|
|
6
|
-
/**
|
|
6
|
+
/** Inverse of a rigid matrix (rotation + translation), column-major. */
|
|
7
7
|
export declare function rigidInv(M: ArrayLike<number>): Float64Array;
|
|
8
8
|
/** Row-major -> column-major. */
|
|
9
9
|
export declare function transpose(a: ArrayLike<number>): Float64Array;
|
|
10
|
-
/**
|
|
10
|
+
/** Matrix from a quaternion [w,x,y,z], translation and scale (column-major). */
|
|
11
11
|
export declare function quatMat(q: ArrayLike<number>, t: ArrayLike<number>, s?: ArrayLike<number>): Float64Array;
|
|
12
12
|
export declare function compose(t: ArrayLike<number>, q: ArrayLike<number>, s: ArrayLike<number>, o: Mat4): void;
|
|
13
13
|
export interface TRS {
|
|
@@ -15,10 +15,10 @@ export interface TRS {
|
|
|
15
15
|
q: number[];
|
|
16
16
|
s: number[];
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
18
|
+
/** Decompose a matrix into translation, rotation and scale (handling reflection). */
|
|
19
19
|
export declare function matToTRS(M: ArrayLike<number>): TRS;
|
|
20
|
-
/**
|
|
20
|
+
/** Key segment that time t falls into: [i, j, fraction]. */
|
|
21
21
|
export declare function keySegment(keys: ReadonlyArray<readonly [number, unknown]>, t: number): [number, number, number];
|
|
22
22
|
export declare function sampleVec(keys: ReadonlyArray<readonly [number, ArrayLike<number>]>, t: number): number[];
|
|
23
|
-
/**
|
|
23
|
+
/** Normalized linear interpolation of quaternions along the shortest arc. */
|
|
24
24
|
export declare function sampleQuat(keys: ReadonlyArray<readonly [number, ArrayLike<number>]>, t: number): number[];
|
package/dist/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sources":["../src/math.ts"],"sourcesContent":["//
|
|
1
|
+
{"version":3,"file":"math.js","sources":["../src/math.ts"],"sourcesContent":["// 4×4 column-major matrices (as in WebGL), quaternions [w, x, y, z].\nexport type Mat4 = Float64Array | Float32Array;\n\nexport function identity(): Float64Array {\n const m = new Float64Array(16);\n m[0] = m[5] = m[10] = m[15] = 1;\n return m;\n}\n\n/** a·b (column-major), result in a new array. */\nexport function mulCol(a: ArrayLike<number>, b: ArrayLike<number>): Float64Array {\n const o = new Float64Array(16);\n mulColInto(a, b, o);\n return o;\n}\n\nexport function mulColInto(a: ArrayLike<number>, b: ArrayLike<number>, o: Mat4): void {\n for (let c = 0; c < 4; c++)\n for (let r = 0; r < 4; r++) {\n let s = 0;\n for (let k = 0; k < 4; k++) s += a[k * 4 + r]! * b[c * 4 + k]!;\n o[c * 4 + r] = s;\n }\n}\n\n/** Inverse of a rigid matrix (rotation + translation), column-major. */\nexport function rigidInv(M: ArrayLike<number>): Float64Array {\n const o = new Float64Array(16);\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) o[c * 4 + r] = M[r * 4 + c]!;\n for (let r = 0; r < 3; r++) o[12 + r] = -(M[r * 4]! * M[12]! + M[r * 4 + 1]! * M[13]! + M[r * 4 + 2]! * M[14]!);\n o[15] = 1;\n return o;\n}\n\n/** Row-major -> column-major. */\nexport function transpose(a: ArrayLike<number>): Float64Array {\n const o = new Float64Array(16);\n for (let r = 0; r < 4; r++) for (let c = 0; c < 4; c++) o[c * 4 + r] = a[r * 4 + c]!;\n return o;\n}\n\n/** Matrix from a quaternion [w,x,y,z], translation and scale (column-major). */\nexport function quatMat(q: ArrayLike<number>, t: ArrayLike<number>, s: ArrayLike<number> = [1, 1, 1]): Float64Array {\n const m = new Float64Array(16);\n compose(t, q, s, m);\n return m;\n}\n\nexport function compose(t: ArrayLike<number>, q: ArrayLike<number>, s: ArrayLike<number>, o: Mat4): void {\n const w = q[0]!, x = q[1]!, y = q[2]!, z = q[3]!;\n const xx = x * x, yy = y * y, zz = z * z, xy = x * y, xz = x * z, yz = y * z, wx = w * x, wy = w * y, wz = w * z;\n const R = [1 - 2 * (yy + zz), 2 * (xy - wz), 2 * (xz + wy), 2 * (xy + wz), 1 - 2 * (xx + zz), 2 * (yz - wx), 2 * (xz - wy), 2 * (yz + wx), 1 - 2 * (xx + yy)];\n for (let c = 0; c < 3; c++) for (let r = 0; r < 3; r++) o[c * 4 + r] = R[r * 3 + c]! * s[c]!;\n o[3] = o[7] = o[11] = 0;\n o[12] = t[0]!; o[13] = t[1]!; o[14] = t[2]!; o[15] = 1;\n}\n\nexport interface TRS { t: number[]; q: number[]; s: number[] }\n\n/** Decompose a matrix into translation, rotation and scale (handling reflection). */\nexport function matToTRS(M: ArrayLike<number>): TRS {\n const sx0 = Math.hypot(M[0]!, M[1]!, M[2]!), sy = Math.hypot(M[4]!, M[5]!, M[6]!), sz = Math.hypot(M[8]!, M[9]!, M[10]!);\n const det = M[0]! * (M[5]! * M[10]! - M[9]! * M[6]!) - M[4]! * (M[1]! * M[10]! - M[9]! * M[2]!) + M[8]! * (M[1]! * M[6]! - M[5]! * M[2]!);\n const sx = det < 0 ? -sx0 : sx0, s = [sx || 1, sy || 1, sz || 1];\n const r = (row: number, col: number) => M[col * 4 + row]! / s[col]!;\n const r00 = r(0, 0), r01 = r(0, 1), r02 = r(0, 2), r10 = r(1, 0), r11 = r(1, 1), r12 = r(1, 2), r20 = r(2, 0), r21 = r(2, 1), r22 = r(2, 2);\n const tr = r00 + r11 + r22;\n let w: number, x: number, y: number, z: number;\n if (tr > 0) { const k = Math.sqrt(tr + 1) * 2; w = k / 4; x = (r21 - r12) / k; y = (r02 - r20) / k; z = (r10 - r01) / k; }\n else if (r00 > r11 && r00 > r22) { const k = Math.sqrt(1 + r00 - r11 - r22) * 2; w = (r21 - r12) / k; x = k / 4; y = (r01 + r10) / k; z = (r02 + r20) / k; }\n else if (r11 > r22) { const k = Math.sqrt(1 + r11 - r00 - r22) * 2; w = (r02 - r20) / k; x = (r01 + r10) / k; y = k / 4; z = (r12 + r21) / k; }\n else { const k = Math.sqrt(1 + r22 - r00 - r11) * 2; w = (r10 - r01) / k; x = (r02 + r20) / k; y = (r12 + r21) / k; z = k / 4; }\n return { t: [M[12]!, M[13]!, M[14]!], q: [w, x, y, z], s };\n}\n\n/** Key segment that time t falls into: [i, j, fraction]. */\nexport function keySegment(keys: ReadonlyArray<readonly [number, unknown]>, t: number): [number, number, number] {\n const last = keys.length - 1;\n if (last <= 0 || t <= keys[0]![0]) return [0, 0, 0];\n if (t >= keys[last]![0]) return [last, last, 0];\n let lo = 0, hi = last;\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n if (keys[mid]![0] <= t) lo = mid; else hi = mid;\n }\n return [lo, hi, (t - keys[lo]![0]) / (keys[hi]![0] - keys[lo]![0] || 1)];\n}\n\nexport function sampleVec(keys: ReadonlyArray<readonly [number, ArrayLike<number>]>, t: number): number[] {\n const [i, j, a] = keySegment(keys, t), A = keys[i]![1], B = keys[j]![1];\n return [A[0]! + (B[0]! - A[0]!) * a, A[1]! + (B[1]! - A[1]!) * a, A[2]! + (B[2]! - A[2]!) * a];\n}\n\n/** Normalized linear interpolation of quaternions along the shortest arc. */\nexport function sampleQuat(keys: ReadonlyArray<readonly [number, ArrayLike<number>]>, t: number): number[] {\n const [i, j, a] = keySegment(keys, t), A = Array.from(keys[i]![1]);\n let B = Array.from(keys[j]![1]);\n if (A[0]! * B[0]! + A[1]! * B[1]! + A[2]! * B[2]! + A[3]! * B[3]! < 0) B = B.map((v) => -v);\n const q = A.map((v, k) => v + (B[k]! - v) * a), l = Math.hypot(...q) || 1;\n return q.map((v) => v / l);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/normals.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { DecodedImage, Mesh } from './types';
|
|
2
|
-
/**
|
|
2
|
+
/** Normal packing in a texture: xyz in RGB; only XY in RG (BC5/ATI2); X in alpha and Y in green (DXT5nm, "swizzled"). */
|
|
3
3
|
export type NormalPacking = 'rgb' | 'rg' | 'ag';
|
|
4
|
-
/**
|
|
4
|
+
/** Candidate normal map names (without extension, same path) for a diffuse texture. */
|
|
5
5
|
export declare function normalCandidates(diffuse: string): string[];
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* RGB
|
|
7
|
+
* Whether an image looks like a normal map and how it is packed. Sampled on a pixel grid:
|
|
8
|
+
* RGB: blue is high on average; RG: blue is nearly constant and low (BC5); AG: red is constant, alpha varies (DXT5nm).
|
|
9
9
|
*/
|
|
10
10
|
export declare function analyzeNormalMap(img: DecodedImage): {
|
|
11
11
|
normal: boolean;
|
|
12
12
|
packing: NormalPacking;
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
14
|
+
/** Tangents from UVs (accumulated per triangle), xyz + bitangent sign in w. */
|
|
15
15
|
export declare function computeTangents(m: Pick<Mesh, 'pos' | 'nor' | 'uv' | 'indices' | 'vertexCount'>): Float32Array;
|
package/dist/normals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normals.js","sources":["../src/normals.ts"],"sourcesContent":["// Карты нормалей: варианты имени по диффузной текстуре, распознавание упаковки (RGB / RG (BC5) / AG (DXT5nm)), касательные.\nimport { baseName } from './binary';\nimport type { DecodedImage, Mesh } from './types';\n\n/** Упаковка нормали в текстуре: xyz в RGB; только XY в RG (BC5/ATI2); X в альфе и Y в зелёном (DXT5nm, «swizzled»). */\nexport type NormalPacking = 'rgb' | 'rg' | 'ag';\n\n/** Суффиксы диффузной текстуры и соответствующие суффиксы карты нормалей (по играм). */\nconst SWAPS: Array<[RegExp, string[]]> = [\n [/_c[oa]$/, ['_nohq', '_nofhq', '_no']], // Arma: _co/_ca -> _nohq\n [/__d(_a)?$/, ['__n_d', '__n']], // Spintires/MudRunner/SnowRunner: __d -> __n_d\n [/_diff(use)?(?=_\\d{3}|$)/, ['_normal', '_n', '_ddn', '_nrm']], // GTA V ped: uppr_diff_000_a_uni -> uppr_normal_000; CryEngine _diff -> _ddn\n [/_b\\.color$/, ['_nm.normal', '_n.normal', '_nm', '_n']], // BeamNG PBR: _b.color -> _nm.normal\n [/_(albedo|basecolor|base_color|color|col|alb)$/, ['_normal', '_n', '_nrm', '_nm']],\n [/_d$/, ['_n', '_nm', '_normal', '_ddn']],\n [/_c$/, ['_n', '_nm']],\n [/_dif$/, ['_nrm', '_nor', '_n']],\n];\nconst PLAIN = ['_n', '_normal', '_nm', '_nrm', '_norm', '_ddn', '_local', '_bump_n', '_nohq'];\n\n/** Имена-кандидаты карты нормалей (без расширения, с тем же путём) для диффузной текстуры. */\nexport function normalCandidates(diffuse: string): string[] {\n if (!diffuse) return [];\n const p = diffuse.replace(/\\\\/g, '/'), dir = p.slice(0, p.lastIndexOf('/') + 1), stem = baseName(p).replace(/\\.(dds|tga|png|jpe?g|paa|pac|pct|vtf|bmp|pcx|gif|webp|wal|xbt)$/i, '').toLowerCase();\n const out = new Set<string>();\n for (const [re, subs] of SWAPS) if (re.test(stem)) for (const s of subs) out.add(stem.replace(re, s));\n // GTA V: uppr_diff_000_a_uni -> uppr_normal_000 (нормаль одна на все варианты цвета)\n const gta = /^([a-z]+)_diff_(\\d{3})_[a-z]_[a-z]+$/.exec(stem);\n if (gta) out.add(`${gta[1]}_normal_${gta[2]}`);\n for (const s of PLAIN) out.add(stem + s);\n out.delete(stem);\n return [...out].map((n) => dir + n);\n}\n\n/**\n * Похоже ли изображение на карту нормалей и как оно упаковано. Выборка по сетке пикселей:\n * RGB — синий в среднем высокий; RG — синий почти постоянный и низкий (BC5); AG — красный постоянный, альфа меняется (DXT5nm).\n */\nexport function analyzeNormalMap(img: DecodedImage): { normal: boolean; packing: NormalPacking } {\n const d = img.rgba;\n if (!d) return { normal: true, packing: 'rgb' }; // ImageBitmap (браузерные PNG/JPG) — считаем обычной RGB-нормалью\n const n = img.width * img.height, step = Math.max(1, Math.floor(n / 4096));\n let cnt = 0, r = 0, g = 0, b = 0, a = 0, rv = 0, av = 0, unit = 0;\n const r0 = d[0]!, a0 = d[3]!;\n for (let i = 0; i < n; i += step) {\n const o = i * 4, R = d[o]!, G = d[o + 1]!, B = d[o + 2]!, A = d[o + 3]!;\n r += R; g += G; b += B; a += A; cnt++;\n rv += Math.abs(R - r0); av += Math.abs(A - a0);\n const x = R / 127.5 - 1, y = G / 127.5 - 1, z = B / 127.5 - 1, len = Math.hypot(x, y, z);\n if (len > 0.75 && len < 1.25 && z > -0.1) unit++;\n }\n r /= cnt; g /= cnt; b /= cnt; a /= cnt; rv /= cnt; av /= cnt;\n // DXT5nm (Arma _nohq и др.): красный пустой (0/255) или постоянный, X — в альфе (в среднем около середины)\n if ((r < 16 || r > 239 || rv < 6) && a > 60 && a < 196 && (av > 2 || Math.abs(a - 128) < 24) && g > 60 && g < 196) return { normal: true, packing: 'ag' };\n if (b < 40 && r > 60 && r < 196 && g > 60 && g < 196) return { normal: true, packing: 'rg' };\n return { normal: b > 150 && unit / cnt > 0.6 && r > 70 && r < 185 && g > 70 && g < 185, packing: 'rgb' };\n}\n\n/** Касательные по UV (накопление по треугольникам), xyz + знак битангенса в w. */\nexport function computeTangents(m: Pick<Mesh, 'pos' | 'nor' | 'uv' | 'indices' | 'vertexCount'>): Float32Array {\n const n = m.vertexCount, t = new Float32Array(n * 3), bt = new Float32Array(n * 3), out = new Float32Array(n * 4);\n const P = m.pos, U = m.uv, I = m.indices;\n for (let k = 0; k + 2 < I.length; k += 3) {\n const a = I[k]!, b = I[k + 1]!, c = I[k + 2]!;\n const e1x = P[b * 3]! - P[a * 3]!, e1y = P[b * 3 + 1]! - P[a * 3 + 1]!, e1z = P[b * 3 + 2]! - P[a * 3 + 2]!;\n const e2x = P[c * 3]! - P[a * 3]!, e2y = P[c * 3 + 1]! - P[a * 3 + 1]!, e2z = P[c * 3 + 2]! - P[a * 3 + 2]!;\n const du1 = U[b * 2]! - U[a * 2]!, dv1 = U[b * 2 + 1]! - U[a * 2 + 1]!, du2 = U[c * 2]! - U[a * 2]!, dv2 = U[c * 2 + 1]! - U[a * 2 + 1]!;\n const det = du1 * dv2 - du2 * dv1;\n if (Math.abs(det) < 1e-12) continue;\n const f = 1 / det;\n const tx = f * (dv2 * e1x - dv1 * e2x), ty = f * (dv2 * e1y - dv1 * e2y), tz = f * (dv2 * e1z - dv1 * e2z);\n const bx = f * (du1 * e2x - du2 * e1x), by = f * (du1 * e2y - du2 * e1y), bz = f * (du1 * e2z - du2 * e1z);\n for (const v of [a, b, c]) { t[v * 3] += tx; t[v * 3 + 1] += ty; t[v * 3 + 2] += tz; bt[v * 3] += bx; bt[v * 3 + 1] += by; bt[v * 3 + 2] += bz; }\n }\n for (let v = 0; v < n; v++) {\n const nx = m.nor[v * 3]!, ny = m.nor[v * 3 + 1]!, nz = m.nor[v * 3 + 2]!;\n let tx = t[v * 3]!, ty = t[v * 3 + 1]!, tz = t[v * 3 + 2]!;\n // Грам — Шмидт: касательная перпендикулярна нормали\n const dn = tx * nx + ty * ny + tz * nz;\n tx -= nx * dn; ty -= ny * dn; tz -= nz * dn;\n let len = Math.hypot(tx, ty, tz);\n if (len < 1e-8) { // нет UV-градиента: любая перпендикулярная\n const ax = Math.abs(nx) < 0.9 ? 1 : 0, ay = ax ? 0 : 1;\n tx = ay * nz - 0 * ny; ty = 0 * nx - ax * nz; tz = ax * ny - ay * nx;\n len = Math.hypot(tx, ty, tz) || 1;\n }\n tx /= len; ty /= len; tz /= len;\n const cx = ny * tz - nz * ty, cy = nz * tx - nx * tz, cz = nx * ty - ny * tx;\n const w = cx * bt[v * 3]! + cy * bt[v * 3 + 1]! + cz * bt[v * 3 + 2]! < 0 ? -1 : 1;\n out[v * 4] = tx; out[v * 4 + 1] = ty; out[v * 4 + 2] = tz; out[v * 4 + 3] = w;\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"normals.js","sources":["../src/normals.ts"],"sourcesContent":["// Normal maps: name variants from the diffuse texture, packing detection (RGB / RG (BC5) / AG (DXT5nm)), tangents.\nimport { baseName } from './binary';\nimport type { DecodedImage, Mesh } from './types';\n\n/** Normal packing in a texture: xyz in RGB; only XY in RG (BC5/ATI2); X in alpha and Y in green (DXT5nm, \"swizzled\"). */\nexport type NormalPacking = 'rgb' | 'rg' | 'ag';\n\n/** Diffuse texture suffixes and the matching normal map suffixes (per game). */\nconst SWAPS: Array<[RegExp, string[]]> = [\n [/_c[oa]$/, ['_nohq', '_nofhq', '_no']], // Arma: _co/_ca -> _nohq\n [/__d(_a)?$/, ['__n_d', '__n']], // Spintires/MudRunner/SnowRunner: __d -> __n_d\n [/_diff(use)?(?=_\\d{3}|$)/, ['_normal', '_n', '_ddn', '_nrm']], // GTA V ped: uppr_diff_000_a_uni -> uppr_normal_000; CryEngine _diff -> _ddn\n [/_b\\.color$/, ['_nm.normal', '_n.normal', '_nm', '_n']], // BeamNG PBR: _b.color -> _nm.normal\n [/_(albedo|basecolor|base_color|color|col|alb)$/, ['_normal', '_n', '_nrm', '_nm']],\n [/_d$/, ['_n', '_nm', '_normal', '_ddn']],\n [/_c$/, ['_n', '_nm']],\n [/_dif$/, ['_nrm', '_nor', '_n']],\n];\nconst PLAIN = ['_n', '_normal', '_nm', '_nrm', '_norm', '_ddn', '_local', '_bump_n', '_nohq'];\n\n/** Candidate normal map names (without extension, same path) for a diffuse texture. */\nexport function normalCandidates(diffuse: string): string[] {\n if (!diffuse) return [];\n const p = diffuse.replace(/\\\\/g, '/'), dir = p.slice(0, p.lastIndexOf('/') + 1), stem = baseName(p).replace(/\\.(dds|tga|png|jpe?g|paa|pac|pct|vtf|bmp|pcx|gif|webp|wal|xbt)$/i, '').toLowerCase();\n const out = new Set<string>();\n for (const [re, subs] of SWAPS) if (re.test(stem)) for (const s of subs) out.add(stem.replace(re, s));\n // GTA V: uppr_diff_000_a_uni -> uppr_normal_000 (one normal map for all color variants)\n const gta = /^([a-z]+)_diff_(\\d{3})_[a-z]_[a-z]+$/.exec(stem);\n if (gta) out.add(`${gta[1]}_normal_${gta[2]}`);\n for (const s of PLAIN) out.add(stem + s);\n out.delete(stem);\n return [...out].map((n) => dir + n);\n}\n\n/**\n * Whether an image looks like a normal map and how it is packed. Sampled on a pixel grid:\n * RGB: blue is high on average; RG: blue is nearly constant and low (BC5); AG: red is constant, alpha varies (DXT5nm).\n */\nexport function analyzeNormalMap(img: DecodedImage): { normal: boolean; packing: NormalPacking } {\n const d = img.rgba;\n if (!d) return { normal: true, packing: 'rgb' }; // ImageBitmap (browser PNG/JPG): treat as a regular RGB normal map\n const n = img.width * img.height, step = Math.max(1, Math.floor(n / 4096));\n let cnt = 0, r = 0, g = 0, b = 0, a = 0, rv = 0, av = 0, unit = 0;\n const r0 = d[0]!, a0 = d[3]!;\n for (let i = 0; i < n; i += step) {\n const o = i * 4, R = d[o]!, G = d[o + 1]!, B = d[o + 2]!, A = d[o + 3]!;\n r += R; g += G; b += B; a += A; cnt++;\n rv += Math.abs(R - r0); av += Math.abs(A - a0);\n const x = R / 127.5 - 1, y = G / 127.5 - 1, z = B / 127.5 - 1, len = Math.hypot(x, y, z);\n if (len > 0.75 && len < 1.25 && z > -0.1) unit++;\n }\n r /= cnt; g /= cnt; b /= cnt; a /= cnt; rv /= cnt; av /= cnt;\n // DXT5nm (Arma _nohq and others): red is empty (0/255) or constant, X is in alpha (around the middle on average)\n if ((r < 16 || r > 239 || rv < 6) && a > 60 && a < 196 && (av > 2 || Math.abs(a - 128) < 24) && g > 60 && g < 196) return { normal: true, packing: 'ag' };\n if (b < 40 && r > 60 && r < 196 && g > 60 && g < 196) return { normal: true, packing: 'rg' };\n return { normal: b > 150 && unit / cnt > 0.6 && r > 70 && r < 185 && g > 70 && g < 185, packing: 'rgb' };\n}\n\n/** Tangents from UVs (accumulated per triangle), xyz + bitangent sign in w. */\nexport function computeTangents(m: Pick<Mesh, 'pos' | 'nor' | 'uv' | 'indices' | 'vertexCount'>): Float32Array {\n const n = m.vertexCount, t = new Float32Array(n * 3), bt = new Float32Array(n * 3), out = new Float32Array(n * 4);\n const P = m.pos, U = m.uv, I = m.indices;\n for (let k = 0; k + 2 < I.length; k += 3) {\n const a = I[k]!, b = I[k + 1]!, c = I[k + 2]!;\n const e1x = P[b * 3]! - P[a * 3]!, e1y = P[b * 3 + 1]! - P[a * 3 + 1]!, e1z = P[b * 3 + 2]! - P[a * 3 + 2]!;\n const e2x = P[c * 3]! - P[a * 3]!, e2y = P[c * 3 + 1]! - P[a * 3 + 1]!, e2z = P[c * 3 + 2]! - P[a * 3 + 2]!;\n const du1 = U[b * 2]! - U[a * 2]!, dv1 = U[b * 2 + 1]! - U[a * 2 + 1]!, du2 = U[c * 2]! - U[a * 2]!, dv2 = U[c * 2 + 1]! - U[a * 2 + 1]!;\n const det = du1 * dv2 - du2 * dv1;\n if (Math.abs(det) < 1e-12) continue;\n const f = 1 / det;\n const tx = f * (dv2 * e1x - dv1 * e2x), ty = f * (dv2 * e1y - dv1 * e2y), tz = f * (dv2 * e1z - dv1 * e2z);\n const bx = f * (du1 * e2x - du2 * e1x), by = f * (du1 * e2y - du2 * e1y), bz = f * (du1 * e2z - du2 * e1z);\n for (const v of [a, b, c]) { t[v * 3] += tx; t[v * 3 + 1] += ty; t[v * 3 + 2] += tz; bt[v * 3] += bx; bt[v * 3 + 1] += by; bt[v * 3 + 2] += bz; }\n }\n for (let v = 0; v < n; v++) {\n const nx = m.nor[v * 3]!, ny = m.nor[v * 3 + 1]!, nz = m.nor[v * 3 + 2]!;\n let tx = t[v * 3]!, ty = t[v * 3 + 1]!, tz = t[v * 3 + 2]!;\n // Gram–Schmidt: the tangent is perpendicular to the normal\n const dn = tx * nx + ty * ny + tz * nz;\n tx -= nx * dn; ty -= ny * dn; tz -= nz * dn;\n let len = Math.hypot(tx, ty, tz);\n if (len < 1e-8) { // no UV gradient: any perpendicular will do\n const ax = Math.abs(nx) < 0.9 ? 1 : 0, ay = ax ? 0 : 1;\n tx = ay * nz - 0 * ny; ty = 0 * nx - ax * nz; tz = ax * ny - ay * nx;\n len = Math.hypot(tx, ty, tz) || 1;\n }\n tx /= len; ty /= len; tz /= len;\n const cx = ny * tz - nz * ty, cy = nz * tx - nx * tz, cz = nx * ty - ny * tx;\n const w = cx * bt[v * 3]! + cy * bt[v * 3 + 1]! + cz * bt[v * 3 + 2]! < 0 ? -1 : 1;\n out[v * 4] = tx; out[v * 4 + 1] = ty; out[v * 4 + 2] = tz; out[v * 4 + 3] = w;\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|