@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.
Files changed (60) hide show
  1. package/README.md +41 -35
  2. package/dist/archives/common.d.ts +9 -9
  3. package/dist/archives/common.js.map +1 -1
  4. package/dist/archives/folder.d.ts +1 -1
  5. package/dist/archives/folder.js +1 -1
  6. package/dist/archives/folder.js.map +1 -1
  7. package/dist/archives/zip.js.map +1 -1
  8. package/dist/binary.d.ts +7 -7
  9. package/dist/binary.js.map +1 -1
  10. package/dist/builtin-en.js.map +1 -1
  11. package/dist/builtin.js +1 -1
  12. package/dist/builtin.js.map +1 -1
  13. package/dist/codecs/zlib.d.ts +2 -2
  14. package/dist/codecs/zlib.js.map +1 -1
  15. package/dist/diagnostics.js.map +1 -1
  16. package/dist/geometry.d.ts +5 -5
  17. package/dist/geometry.js.map +1 -1
  18. package/dist/i18n.d.ts +4 -4
  19. package/dist/i18n.js.map +1 -1
  20. package/dist/images/bc45.d.ts +1 -1
  21. package/dist/images/bc45.js.map +1 -1
  22. package/dist/images/bc7.d.ts +1 -1
  23. package/dist/images/bc7.js.map +1 -1
  24. package/dist/images/dds.d.ts +1 -1
  25. package/dist/images/dds.js.map +1 -1
  26. package/dist/images/pcx.js.map +1 -1
  27. package/dist/images/tga.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/levelbuilder.d.ts +3 -3
  31. package/dist/levelbuilder.js +1 -1
  32. package/dist/levelbuilder.js.map +1 -1
  33. package/dist/math.d.ts +6 -6
  34. package/dist/math.js.map +1 -1
  35. package/dist/normals.d.ts +5 -5
  36. package/dist/normals.js.map +1 -1
  37. package/dist/plugin.d.ts +57 -57
  38. package/dist/plugin.js.map +1 -1
  39. package/dist/registry.d.ts +14 -14
  40. package/dist/registry.js +13 -13
  41. package/dist/registry.js.map +1 -1
  42. package/dist/scene.d.ts +14 -14
  43. package/dist/scene.js.map +1 -1
  44. package/dist/session.d.ts +34 -34
  45. package/dist/session.js +33 -33
  46. package/dist/session.js.map +1 -1
  47. package/dist/skeleton.d.ts +3 -3
  48. package/dist/skeleton.js.map +1 -1
  49. package/dist/surface.d.ts +4 -4
  50. package/dist/surface.js.map +1 -1
  51. package/dist/textures.d.ts +12 -12
  52. package/dist/textures.js +9 -9
  53. package/dist/textures.js.map +1 -1
  54. package/dist/types.d.ts +103 -103
  55. package/dist/types.js.map +1 -1
  56. package/dist/writers/dds.d.ts +1 -1
  57. package/dist/writers/dds.js.map +1 -1
  58. package/dist/writers/obj.js.map +1 -1
  59. package/dist/writers/zip.js.map +1 -1
  60. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"bc45.js","sources":["../../src/images/bc45.ts"],"sourcesContent":["// BC4 (ATI1, один канал) и BC5 (ATI2, два канала — XY карты нормалей, Z восстанавливается): в RGBA8.\n\n/** Блок «альфа DXT5» (BC4): 8 байт -> 16 значений. */\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 → серый, BC5 (two) → нормаль: R, G из блоков, 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;"}
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;"}
@@ -1,2 +1,2 @@
1
- /** Распаковать BC7 (w×h) начиная с off. */
1
+ /** Decode BC7 (w×h) starting at off. */
2
2
  export declare function decodeBC7(src: Uint8Array, off: number, w: number, h: number): Uint8Array;
@@ -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":"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"}
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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"}
@@ -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
- /** Распаковка блоков DXT1/3/5 в RGBA. */
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;
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pcx.js","sources":["../../src/images/pcx.ts"],"sourcesContent":["// PCX (Quake II): 8 бит с палитрой в конце файла или 24 бит (3 плоскости), 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;"}
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;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tga.js","sources":["../../src/images/tga.ts"],"sourcesContent":["// TGA: truecolor / grayscale / colormap, с RLE и без; ориентация по биту 5 дескриптора.\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;"}
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 — ядро просмотрщика игровых моделей: типы, реестр плагинов, автоопределение, архивы, кодеки, сессия.\n// Движки — отдельные пакеты: `import { xrayV1Engine } from '@gmvjs/xray-v1'`, одна игра — `@gmvjs/xray-v1/cop`, все — `@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/** Реестр с встроенным ядром и переданными движками. */\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;"}
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;"}
@@ -1,5 +1,5 @@
1
1
  import type { InstancedScene, Mesh } from './types';
2
- /** Метка-ромб (свет, частицы): 6 вершин, 8 граней. */
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
- /** Прототип: части модели; kind — префикс ключа групп (трава отдельно от статики, чтобы её можно было скрыть). */
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;
@@ -17,7 +17,7 @@ class LevelBuilder {
17
17
  }
18
18
  return g;
19
19
  }
20
- /** Прототип: части модели; kind — префикс ключа групп (трава отдельно от статики, чтобы её можно было скрыть). */
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));
@@ -1 +1 @@
1
- {"version":3,"file":"levelbuilder.js","sources":["../src/levelbuilder.ts"],"sourcesContent":["// Сборка уровня из экземпляров моделей: экземпляры складываются в общие меши по материалу (массивы выделяются один раз в конце),\n// сцена InstancedScene хранит прототипы и расстановку (для выделения и скрытия объектов).\nimport type { InstancedScene, Mesh, PlacementRange } from './types';\n\n/** Метка-ромб (свет, частицы): 6 вершин, 8 граней. */\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/** Сборка сцены: экземпляры складываются в общие меши по материалу; массивы выделяются один раз в конце. */\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 /** Прототип: части модели; kind — префикс ключа групп (трава отдельно от статики, чтобы её можно было скрыть). */\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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"}
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
- /** Обратная к жёсткой матрице (поворот + перенос), column-major. */
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
- /** Матрица из кватерниона [w,x,y,z], переноса и масштаба (column-major). */
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
- /** Отрезок ключей, в который попадает время t: [i, j, доля]. */
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":["// Матрицы 4×4 column-major (как в WebGL), кватернионы [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), результат в новом массиве. */\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/** Обратная к жёсткой матрице (поворот + перенос), 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/** Матрица из кватерниона [w,x,y,z], переноса и масштаба (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/** Разложение матрицы на перенос, поворот, масштаб (с учётом отражения). */\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/** Отрезок ключей, в который попадает время t: [i, j, доля]. */\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/** Нормализованная линейная интерполяция кватернионов по кратчайшей дуге. */\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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"}
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
- /** Упаковка нормали в текстуре: xyz в RGB; только XY в RG (BC5/ATI2); X в альфе и Y в зелёном (DXT5nm, «swizzled»). */
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 — синий в среднем высокий; RG — синий почти постоянный и низкий (BC5); AG — красный постоянный, альфа меняется (DXT5nm).
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
- /** Касательные по UV (накопление по треугольникам), xyz + знак битангенса в w. */
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;
@@ -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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"}