@babylonjs/ktx2decoder 6.45.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 (72) hide show
  1. package/Misc/dataReader.d.ts +65 -0
  2. package/Misc/dataReader.js +116 -0
  3. package/Misc/dataReader.js.map +1 -0
  4. package/Misc/index.d.ts +1 -0
  5. package/Misc/index.js +2 -0
  6. package/Misc/index.js.map +1 -0
  7. package/Transcoders/index.d.ts +8 -0
  8. package/Transcoders/index.js +9 -0
  9. package/Transcoders/index.js.map +1 -0
  10. package/Transcoders/liteTranscoder.d.ts +25 -0
  11. package/Transcoders/liteTranscoder.js +63 -0
  12. package/Transcoders/liteTranscoder.js.map +1 -0
  13. package/Transcoders/liteTranscoder_UASTC_ASTC.d.ts +19 -0
  14. package/Transcoders/liteTranscoder_UASTC_ASTC.js +29 -0
  15. package/Transcoders/liteTranscoder_UASTC_ASTC.js.map +1 -0
  16. package/Transcoders/liteTranscoder_UASTC_BC7.d.ts +19 -0
  17. package/Transcoders/liteTranscoder_UASTC_BC7.js +29 -0
  18. package/Transcoders/liteTranscoder_UASTC_BC7.js.map +1 -0
  19. package/Transcoders/liteTranscoder_UASTC_R8_UNORM.d.ts +21 -0
  20. package/Transcoders/liteTranscoder_UASTC_R8_UNORM.js +36 -0
  21. package/Transcoders/liteTranscoder_UASTC_R8_UNORM.js.map +1 -0
  22. package/Transcoders/liteTranscoder_UASTC_RG8_UNORM.d.ts +21 -0
  23. package/Transcoders/liteTranscoder_UASTC_RG8_UNORM.js +36 -0
  24. package/Transcoders/liteTranscoder_UASTC_RG8_UNORM.js.map +1 -0
  25. package/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.d.ts +21 -0
  26. package/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.js +36 -0
  27. package/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.js.map +1 -0
  28. package/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.d.ts +21 -0
  29. package/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.js +36 -0
  30. package/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.js.map +1 -0
  31. package/Transcoders/mscTranscoder.d.ts +32 -0
  32. package/Transcoders/mscTranscoder.js +128 -0
  33. package/Transcoders/mscTranscoder.js.map +1 -0
  34. package/index.d.ts +8 -0
  35. package/index.js +10 -0
  36. package/index.js.map +1 -0
  37. package/ktx2Decoder.d.ts +22 -0
  38. package/ktx2Decoder.js +144 -0
  39. package/ktx2Decoder.js.map +1 -0
  40. package/ktx2FileReader.d.ts +109 -0
  41. package/ktx2FileReader.js +219 -0
  42. package/ktx2FileReader.js.map +1 -0
  43. package/legacy/legacy.d.ts +1 -0
  44. package/legacy/legacy.js +8 -0
  45. package/legacy/legacy.js.map +1 -0
  46. package/license.md +71 -0
  47. package/package.json +49 -0
  48. package/readme.md +1 -0
  49. package/transcodeDecisionTree.d.ts +18 -0
  50. package/transcodeDecisionTree.js +240 -0
  51. package/transcodeDecisionTree.js.map +1 -0
  52. package/transcoder.d.ts +17 -0
  53. package/transcoder.js +28 -0
  54. package/transcoder.js.map +1 -0
  55. package/transcoderManager.d.ts +13 -0
  56. package/transcoderManager.js +50 -0
  57. package/transcoderManager.js.map +1 -0
  58. package/wasm/license.md +361 -0
  59. package/wasm/msc_basis_transcoder.js +21 -0
  60. package/wasm/msc_basis_transcoder.wasm +0 -0
  61. package/wasm/uastc_astc.wasm +0 -0
  62. package/wasm/uastc_bc7.wasm +0 -0
  63. package/wasm/uastc_r8_unorm.wasm +0 -0
  64. package/wasm/uastc_rg8_unorm.wasm +0 -0
  65. package/wasm/uastc_rgba8_srgb_v2.wasm +0 -0
  66. package/wasm/uastc_rgba8_unorm_v2.wasm +0 -0
  67. package/wasmMemoryManager.d.ts +17 -0
  68. package/wasmMemoryManager.js +63 -0
  69. package/wasmMemoryManager.js.map +1 -0
  70. package/zstddec.d.ts +41 -0
  71. package/zstddec.js +95 -0
  72. package/zstddec.js.map +1 -0
@@ -0,0 +1,36 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ import { LiteTranscoder } from "./liteTranscoder.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ // eslint-disable-next-line @typescript-eslint/naming-convention
7
+ export class LiteTranscoder_UASTC_RGBA_SRGB extends LiteTranscoder {
8
+ static CanTranscode(src, dst, isInGammaSpace) {
9
+ return src === KTX2.SourceTextureFormat.UASTC4x4 && dst === KTX2.TranscodeTarget.RGBA32 && isInGammaSpace;
10
+ }
11
+ getName() {
12
+ return LiteTranscoder_UASTC_RGBA_SRGB.Name;
13
+ }
14
+ initialize() {
15
+ super.initialize();
16
+ this._transcodeInPlace = false;
17
+ this.setModulePath(LiteTranscoder_UASTC_RGBA_SRGB.WasmModuleURL, LiteTranscoder_UASTC_RGBA_SRGB.WasmBinary);
18
+ }
19
+ transcode(src, dst, level, width, height, uncompressedByteLength, ktx2Reader, imageDesc, encodedData) {
20
+ return this._loadModule().then((moduleWrapper) => {
21
+ const transcoder = moduleWrapper.module;
22
+ const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4);
23
+ return transcoder.decode(width, height) === 0 ? uncompressedTextureView.slice() : null;
24
+ });
25
+ }
26
+ }
27
+ /**
28
+ * URL to use when loading the wasm module for the transcoder (srgb)
29
+ */
30
+ LiteTranscoder_UASTC_RGBA_SRGB.WasmModuleURL = "https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_srgb_v2.wasm";
31
+ /**
32
+ * Binary data of the wasm module
33
+ */
34
+ LiteTranscoder_UASTC_RGBA_SRGB.WasmBinary = null;
35
+ LiteTranscoder_UASTC_RGBA_SRGB.Name = "UniversalTranscoder_UASTC_RGBA_SRGB";
36
+ //# sourceMappingURL=liteTranscoder_UASTC_RGBA_SRGB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liteTranscoder_UASTC_RGBA_SRGB.js","sourceRoot":"","sources":["../../../../tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,+DAAiD;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,8BAA+B,SAAQ,cAAc;IAWvD,MAAM,CAAC,YAAY,CAAC,GAA6B,EAAE,GAAyB,EAAE,cAAuB;QACxG,OAAO,GAAG,KAAK,IAAI,CAAC,mBAAmB,CAAC,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,cAAc,CAAC;IAC9G,CAAC;IAIM,OAAO;QACV,OAAO,8BAA8B,CAAC,IAAI,CAAC;IAC/C,CAAC;IAEM,UAAU;QACb,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,8BAA8B,CAAC,aAAa,EAAE,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAChH,CAAC;IAEM,SAAS,CACZ,GAA6B,EAC7B,GAAyB,EACzB,KAAa,EACb,KAAa,EACb,MAAc,EACd,sBAA8B,EAC9B,UAA0B,EAC1B,SAAiC,EACjC,WAAuB;QAEvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,aAAkB,EAAE,EAAE;YAClD,MAAM,UAAU,GAAQ,aAAa,CAAC,MAAM,CAAC;YAC7C,MAAM,CAAC,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAEpH,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAwB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,CAAC,CAAC,CAAC;IACP,CAAC;;AA3CD;;GAEG;AACW,4CAAa,GAAG,sEAAsE,CAAC;AAErG;;GAEG;AACW,yCAAU,GAAuB,IAAI,CAAC;AAMtC,mCAAI,GAAG,qCAAqC,CAAC","sourcesContent":["import * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { LiteTranscoder } from \"./liteTranscoder\";\r\nimport type { KTX2FileReader, IKTX2_ImageDesc } from \"../ktx2FileReader\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class LiteTranscoder_UASTC_RGBA_SRGB extends LiteTranscoder {\r\n /**\r\n * URL to use when loading the wasm module for the transcoder (srgb)\r\n */\r\n public static WasmModuleURL = \"https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_srgb_v2.wasm\";\r\n\r\n /**\r\n * Binary data of the wasm module\r\n */\r\n public static WasmBinary: ArrayBuffer | null = null;\r\n\r\n public static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean {\r\n return src === KTX2.SourceTextureFormat.UASTC4x4 && dst === KTX2.TranscodeTarget.RGBA32 && isInGammaSpace;\r\n }\r\n\r\n public static Name = \"UniversalTranscoder_UASTC_RGBA_SRGB\";\r\n\r\n public getName(): string {\r\n return LiteTranscoder_UASTC_RGBA_SRGB.Name;\r\n }\r\n\r\n public initialize(): void {\r\n super.initialize();\r\n this._transcodeInPlace = false;\r\n this.setModulePath(LiteTranscoder_UASTC_RGBA_SRGB.WasmModuleURL, LiteTranscoder_UASTC_RGBA_SRGB.WasmBinary);\r\n }\r\n\r\n public transcode(\r\n src: KTX2.SourceTextureFormat,\r\n dst: KTX2.TranscodeTarget,\r\n level: number,\r\n width: number,\r\n height: number,\r\n uncompressedByteLength: number,\r\n ktx2Reader: KTX2FileReader,\r\n imageDesc: IKTX2_ImageDesc | null,\r\n encodedData: Uint8Array\r\n ): Promise<Uint8Array | null> {\r\n return this._loadModule().then((moduleWrapper: any) => {\r\n const transcoder: any = moduleWrapper.module;\r\n const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4);\r\n\r\n return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null;\r\n });\r\n }\r\n}\r\n"]}
@@ -0,0 +1,21 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ import { LiteTranscoder } from "./liteTranscoder";
3
+ import type { KTX2FileReader, IKTX2_ImageDesc } from "../ktx2FileReader";
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare class LiteTranscoder_UASTC_RGBA_UNORM extends LiteTranscoder {
8
+ /**
9
+ * URL to use when loading the wasm module for the transcoder (unorm)
10
+ */
11
+ static WasmModuleURL: string;
12
+ /**
13
+ * Binary data of the wasm module
14
+ */
15
+ static WasmBinary: ArrayBuffer | null;
16
+ static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean;
17
+ static Name: string;
18
+ getName(): string;
19
+ initialize(): void;
20
+ transcode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, level: number, width: number, height: number, uncompressedByteLength: number, ktx2Reader: KTX2FileReader, imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array): Promise<Uint8Array | null>;
21
+ }
@@ -0,0 +1,36 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ import { LiteTranscoder } from "./liteTranscoder.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ // eslint-disable-next-line @typescript-eslint/naming-convention
7
+ export class LiteTranscoder_UASTC_RGBA_UNORM extends LiteTranscoder {
8
+ static CanTranscode(src, dst, isInGammaSpace) {
9
+ return src === KTX2.SourceTextureFormat.UASTC4x4 && dst === KTX2.TranscodeTarget.RGBA32 && !isInGammaSpace;
10
+ }
11
+ getName() {
12
+ return LiteTranscoder_UASTC_RGBA_UNORM.Name;
13
+ }
14
+ initialize() {
15
+ super.initialize();
16
+ this._transcodeInPlace = false;
17
+ this.setModulePath(LiteTranscoder_UASTC_RGBA_UNORM.WasmModuleURL, LiteTranscoder_UASTC_RGBA_UNORM.WasmBinary);
18
+ }
19
+ transcode(src, dst, level, width, height, uncompressedByteLength, ktx2Reader, imageDesc, encodedData) {
20
+ return this._loadModule().then((moduleWrapper) => {
21
+ const transcoder = moduleWrapper.module;
22
+ const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4);
23
+ return transcoder.decode(width, height) === 0 ? uncompressedTextureView.slice() : null;
24
+ });
25
+ }
26
+ }
27
+ /**
28
+ * URL to use when loading the wasm module for the transcoder (unorm)
29
+ */
30
+ LiteTranscoder_UASTC_RGBA_UNORM.WasmModuleURL = "https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_unorm_v2.wasm";
31
+ /**
32
+ * Binary data of the wasm module
33
+ */
34
+ LiteTranscoder_UASTC_RGBA_UNORM.WasmBinary = null;
35
+ LiteTranscoder_UASTC_RGBA_UNORM.Name = "UniversalTranscoder_UASTC_RGBA_UNORM";
36
+ //# sourceMappingURL=liteTranscoder_UASTC_RGBA_UNORM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liteTranscoder_UASTC_RGBA_UNORM.js","sourceRoot":"","sources":["../../../../tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,+DAAiD;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,+BAAgC,SAAQ,cAAc;IAWxD,MAAM,CAAC,YAAY,CAAC,GAA6B,EAAE,GAAyB,EAAE,cAAuB;QACxG,OAAO,GAAG,KAAK,IAAI,CAAC,mBAAmB,CAAC,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC;IAC/G,CAAC;IAIM,OAAO;QACV,OAAO,+BAA+B,CAAC,IAAI,CAAC;IAChD,CAAC;IAEM,UAAU;QACb,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC,aAAa,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC;IAClH,CAAC;IAEM,SAAS,CACZ,GAA6B,EAC7B,GAAyB,EACzB,KAAa,EACb,KAAa,EACb,MAAc,EACd,sBAA8B,EAC9B,UAA0B,EAC1B,SAAiC,EACjC,WAAuB;QAEvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,aAAkB,EAAE,EAAE;YAClD,MAAM,UAAU,GAAQ,aAAa,CAAC,MAAM,CAAC;YAC7C,MAAM,CAAC,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAEpH,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAwB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,CAAC,CAAC,CAAC;IACP,CAAC;;AA3CD;;GAEG;AACW,6CAAa,GAAG,uEAAuE,CAAC;AAEtG;;GAEG;AACW,0CAAU,GAAuB,IAAI,CAAC;AAMtC,oCAAI,GAAG,sCAAsC,CAAC","sourcesContent":["import * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { LiteTranscoder } from \"./liteTranscoder\";\r\nimport type { KTX2FileReader, IKTX2_ImageDesc } from \"../ktx2FileReader\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class LiteTranscoder_UASTC_RGBA_UNORM extends LiteTranscoder {\r\n /**\r\n * URL to use when loading the wasm module for the transcoder (unorm)\r\n */\r\n public static WasmModuleURL = \"https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_unorm_v2.wasm\";\r\n\r\n /**\r\n * Binary data of the wasm module\r\n */\r\n public static WasmBinary: ArrayBuffer | null = null;\r\n\r\n public static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean {\r\n return src === KTX2.SourceTextureFormat.UASTC4x4 && dst === KTX2.TranscodeTarget.RGBA32 && !isInGammaSpace;\r\n }\r\n\r\n public static Name = \"UniversalTranscoder_UASTC_RGBA_UNORM\";\r\n\r\n public getName(): string {\r\n return LiteTranscoder_UASTC_RGBA_UNORM.Name;\r\n }\r\n\r\n public initialize(): void {\r\n super.initialize();\r\n this._transcodeInPlace = false;\r\n this.setModulePath(LiteTranscoder_UASTC_RGBA_UNORM.WasmModuleURL, LiteTranscoder_UASTC_RGBA_UNORM.WasmBinary);\r\n }\r\n\r\n public transcode(\r\n src: KTX2.SourceTextureFormat,\r\n dst: KTX2.TranscodeTarget,\r\n level: number,\r\n width: number,\r\n height: number,\r\n uncompressedByteLength: number,\r\n ktx2Reader: KTX2FileReader,\r\n imageDesc: IKTX2_ImageDesc | null,\r\n encodedData: Uint8Array\r\n ): Promise<Uint8Array | null> {\r\n return this._loadModule().then((moduleWrapper: any) => {\r\n const transcoder: any = moduleWrapper.module;\r\n const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4);\r\n\r\n return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null;\r\n });\r\n }\r\n}\r\n"]}
@@ -0,0 +1,32 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ import { Transcoder } from "../transcoder";
3
+ import type { KTX2FileReader, IKTX2_ImageDesc } from "../ktx2FileReader";
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare class MSCTranscoder extends Transcoder {
8
+ /**
9
+ * URL to use when loading the MSC transcoder
10
+ */
11
+ static JSModuleURL: string;
12
+ /**
13
+ * URL to use when loading the wasm module for the transcoder
14
+ */
15
+ static WasmModuleURL: string;
16
+ /**
17
+ * Binary data of the wasm module
18
+ */
19
+ static WasmBinary: ArrayBuffer | null;
20
+ /**
21
+ * MSC transcoder module, if provided externally
22
+ */
23
+ static JSModule: any;
24
+ static UseFromWorkerThread: boolean;
25
+ static Name: string;
26
+ getName(): string;
27
+ private _mscBasisTranscoderPromise;
28
+ private _mscBasisModule;
29
+ private _getMSCBasisTranscoder;
30
+ static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean;
31
+ transcode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, level: number, width: number, height: number, uncompressedByteLength: number, ktx2Reader: KTX2FileReader, imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array): Promise<Uint8Array | null>;
32
+ }
@@ -0,0 +1,128 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ import { Transcoder } from "../transcoder.js";
3
+ import { WASMMemoryManager } from "../wasmMemoryManager.js";
4
+ /**
5
+ * @internal
6
+ */
7
+ export class MSCTranscoder extends Transcoder {
8
+ getName() {
9
+ return MSCTranscoder.Name;
10
+ }
11
+ _getMSCBasisTranscoder() {
12
+ if (this._mscBasisTranscoderPromise) {
13
+ return this._mscBasisTranscoderPromise;
14
+ }
15
+ this._mscBasisTranscoderPromise = (MSCTranscoder.WasmBinary ? Promise.resolve(MSCTranscoder.WasmBinary) : WASMMemoryManager.LoadWASM(Transcoder.GetWasmUrl(MSCTranscoder.WasmModuleURL))).then((wasmBinary) => {
16
+ if (MSCTranscoder.JSModule) {
17
+ MSC_TRANSCODER = MSCTranscoder.JSModule;
18
+ }
19
+ else {
20
+ if (MSCTranscoder.UseFromWorkerThread) {
21
+ importScripts(Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL));
22
+ }
23
+ // Worker Number = 0 and MSC_TRANSCODER has not been loaded yet.
24
+ else if (typeof MSC_TRANSCODER === "undefined") {
25
+ return new Promise((resolve, reject) => {
26
+ const head = document.getElementsByTagName("head")[0];
27
+ const script = document.createElement("script");
28
+ script.setAttribute("type", "text/javascript");
29
+ script.setAttribute("src", Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL));
30
+ script.onload = () => {
31
+ MSC_TRANSCODER({ wasmBinary }).then((basisModule) => {
32
+ basisModule.initTranscoders();
33
+ this._mscBasisModule = basisModule;
34
+ resolve();
35
+ });
36
+ };
37
+ script.onerror = () => {
38
+ reject("Can not load MSC_TRANSCODER script.");
39
+ };
40
+ head.appendChild(script);
41
+ });
42
+ }
43
+ }
44
+ return new Promise((resolve) => {
45
+ MSC_TRANSCODER({ wasmBinary }).then((basisModule) => {
46
+ basisModule.initTranscoders();
47
+ this._mscBasisModule = basisModule;
48
+ resolve();
49
+ });
50
+ });
51
+ });
52
+ return this._mscBasisTranscoderPromise;
53
+ }
54
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
55
+ static CanTranscode(src, dst, isInGammaSpace) {
56
+ return true;
57
+ }
58
+ transcode(src, dst, level, width, height, uncompressedByteLength, ktx2Reader, imageDesc, encodedData) {
59
+ const isVideo = false;
60
+ return this._getMSCBasisTranscoder().then(() => {
61
+ const basisModule = this._mscBasisModule;
62
+ let transcoder;
63
+ let imageInfo;
64
+ let result;
65
+ let textureData = null;
66
+ try {
67
+ transcoder = src === KTX2.SourceTextureFormat.UASTC4x4 ? new basisModule.UastcImageTranscoder() : new basisModule.BasisLzEtc1sImageTranscoder();
68
+ const texFormat = src === KTX2.SourceTextureFormat.UASTC4x4 ? basisModule.TextureFormat.UASTC4x4 : basisModule.TextureFormat.ETC1S;
69
+ imageInfo = new basisModule.ImageInfo(texFormat, width, height, level);
70
+ const targetFormat = basisModule.TranscodeTarget[KTX2.TranscodeTarget[dst]]; // works because the labels of the sourceTextureFormat enum are the same as the property names used in TranscodeTarget!
71
+ if (!basisModule.isFormatSupported(targetFormat, texFormat)) {
72
+ throw new Error(`MSCTranscoder: Transcoding from "${KTX2.SourceTextureFormat[src]}" to "${KTX2.TranscodeTarget[dst]}" not supported by current transcoder build.`);
73
+ }
74
+ if (src === KTX2.SourceTextureFormat.ETC1S) {
75
+ const sgd = ktx2Reader.supercompressionGlobalData;
76
+ transcoder.decodePalettes(sgd.endpointCount, sgd.endpointsData, sgd.selectorCount, sgd.selectorsData);
77
+ transcoder.decodeTables(sgd.tablesData);
78
+ imageInfo.flags = imageDesc.imageFlags;
79
+ imageInfo.rgbByteOffset = 0;
80
+ imageInfo.rgbByteLength = imageDesc.rgbSliceByteLength;
81
+ imageInfo.alphaByteOffset = imageDesc.alphaSliceByteOffset > 0 ? imageDesc.rgbSliceByteLength : 0;
82
+ imageInfo.alphaByteLength = imageDesc.alphaSliceByteLength;
83
+ result = transcoder.transcodeImage(targetFormat, encodedData, imageInfo, 0, isVideo);
84
+ }
85
+ else {
86
+ imageInfo.flags = 0;
87
+ imageInfo.rgbByteOffset = 0;
88
+ imageInfo.rgbByteLength = uncompressedByteLength;
89
+ imageInfo.alphaByteOffset = 0;
90
+ imageInfo.alphaByteLength = 0;
91
+ result = transcoder.transcodeImage(targetFormat, encodedData, imageInfo, 0, ktx2Reader.hasAlpha, isVideo);
92
+ }
93
+ }
94
+ finally {
95
+ if (transcoder) {
96
+ transcoder.delete();
97
+ }
98
+ if (imageInfo) {
99
+ imageInfo.delete();
100
+ }
101
+ if (result && result.transcodedImage) {
102
+ textureData = result.transcodedImage.get_typed_memory_view().slice();
103
+ result.transcodedImage.delete();
104
+ }
105
+ }
106
+ return textureData;
107
+ });
108
+ }
109
+ }
110
+ /**
111
+ * URL to use when loading the MSC transcoder
112
+ */
113
+ MSCTranscoder.JSModuleURL = "https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.js";
114
+ /**
115
+ * URL to use when loading the wasm module for the transcoder
116
+ */
117
+ MSCTranscoder.WasmModuleURL = "https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.wasm";
118
+ /**
119
+ * Binary data of the wasm module
120
+ */
121
+ MSCTranscoder.WasmBinary = null;
122
+ /**
123
+ * MSC transcoder module, if provided externally
124
+ */
125
+ MSCTranscoder.JSModule = null;
126
+ MSCTranscoder.UseFromWorkerThread = true;
127
+ MSCTranscoder.Name = "MSCTranscoder";
128
+ //# sourceMappingURL=mscTranscoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mscTranscoder.js","sourceRoot":"","sources":["../../../../tools/ktx2Decoder/src/Transcoders/mscTranscoder.ts"],"names":[],"mappings":"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","sourcesContent":["import * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { Transcoder } from \"../transcoder\";\r\nimport type { KTX2FileReader, IKTX2_ImageDesc } from \"../ktx2FileReader\";\r\nimport { WASMMemoryManager } from \"../wasmMemoryManager\";\r\n\r\ndeclare let MSC_TRANSCODER: any;\r\n\r\ndeclare function importScripts(...urls: string[]): void;\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class MSCTranscoder extends Transcoder {\r\n /**\r\n * URL to use when loading the MSC transcoder\r\n */\r\n public static JSModuleURL = \"https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.js\";\r\n /**\r\n * URL to use when loading the wasm module for the transcoder\r\n */\r\n public static WasmModuleURL = \"https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.wasm\";\r\n\r\n /**\r\n * Binary data of the wasm module\r\n */\r\n public static WasmBinary: ArrayBuffer | null = null;\r\n\r\n /**\r\n * MSC transcoder module, if provided externally\r\n */\r\n public static JSModule: any = null;\r\n\r\n public static UseFromWorkerThread = true;\r\n\r\n public static Name = \"MSCTranscoder\";\r\n\r\n public getName(): string {\r\n return MSCTranscoder.Name;\r\n }\r\n\r\n private _mscBasisTranscoderPromise: Promise<void>;\r\n private _mscBasisModule: any;\r\n\r\n private _getMSCBasisTranscoder(): Promise<void> {\r\n if (this._mscBasisTranscoderPromise) {\r\n return this._mscBasisTranscoderPromise;\r\n }\r\n\r\n this._mscBasisTranscoderPromise = (\r\n MSCTranscoder.WasmBinary ? Promise.resolve(MSCTranscoder.WasmBinary) : WASMMemoryManager.LoadWASM(Transcoder.GetWasmUrl(MSCTranscoder.WasmModuleURL))\r\n ).then((wasmBinary) => {\r\n if (MSCTranscoder.JSModule) {\r\n MSC_TRANSCODER = MSCTranscoder.JSModule;\r\n } else {\r\n if (MSCTranscoder.UseFromWorkerThread) {\r\n importScripts(Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL));\r\n }\r\n // Worker Number = 0 and MSC_TRANSCODER has not been loaded yet.\r\n else if (typeof MSC_TRANSCODER === \"undefined\") {\r\n return new Promise((resolve, reject) => {\r\n const head = document.getElementsByTagName(\"head\")[0];\r\n const script = document.createElement(\"script\");\r\n script.setAttribute(\"type\", \"text/javascript\");\r\n script.setAttribute(\"src\", Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL));\r\n\r\n script.onload = () => {\r\n MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => {\r\n basisModule.initTranscoders();\r\n this._mscBasisModule = basisModule;\r\n resolve();\r\n });\r\n };\r\n\r\n script.onerror = () => {\r\n reject(\"Can not load MSC_TRANSCODER script.\");\r\n };\r\n\r\n head.appendChild(script);\r\n });\r\n }\r\n }\r\n\r\n return new Promise((resolve) => {\r\n MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => {\r\n basisModule.initTranscoders();\r\n this._mscBasisModule = basisModule;\r\n resolve();\r\n });\r\n });\r\n });\r\n\r\n return this._mscBasisTranscoderPromise;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean {\r\n return true;\r\n }\r\n\r\n public transcode(\r\n src: KTX2.SourceTextureFormat,\r\n dst: KTX2.TranscodeTarget,\r\n level: number,\r\n width: number,\r\n height: number,\r\n uncompressedByteLength: number,\r\n ktx2Reader: KTX2FileReader,\r\n imageDesc: IKTX2_ImageDesc | null,\r\n encodedData: Uint8Array\r\n ): Promise<Uint8Array | null> {\r\n const isVideo = false;\r\n\r\n return this._getMSCBasisTranscoder().then(() => {\r\n const basisModule = this._mscBasisModule;\r\n\r\n let transcoder: any;\r\n let imageInfo: any;\r\n let result: any;\r\n let textureData: any = null;\r\n\r\n try {\r\n transcoder = src === KTX2.SourceTextureFormat.UASTC4x4 ? new basisModule.UastcImageTranscoder() : new basisModule.BasisLzEtc1sImageTranscoder();\r\n const texFormat = src === KTX2.SourceTextureFormat.UASTC4x4 ? basisModule.TextureFormat.UASTC4x4 : basisModule.TextureFormat.ETC1S;\r\n\r\n imageInfo = new basisModule.ImageInfo(texFormat, width, height, level);\r\n\r\n const targetFormat = basisModule.TranscodeTarget[KTX2.TranscodeTarget[dst]]; // works because the labels of the sourceTextureFormat enum are the same as the property names used in TranscodeTarget!\r\n\r\n if (!basisModule.isFormatSupported(targetFormat, texFormat)) {\r\n throw new Error(\r\n `MSCTranscoder: Transcoding from \"${KTX2.SourceTextureFormat[src]}\" to \"${KTX2.TranscodeTarget[dst]}\" not supported by current transcoder build.`\r\n );\r\n }\r\n\r\n if (src === KTX2.SourceTextureFormat.ETC1S) {\r\n const sgd = ktx2Reader.supercompressionGlobalData;\r\n\r\n transcoder.decodePalettes(sgd.endpointCount, sgd.endpointsData, sgd.selectorCount, sgd.selectorsData);\r\n transcoder.decodeTables(sgd.tablesData);\r\n\r\n imageInfo.flags = imageDesc!.imageFlags;\r\n imageInfo.rgbByteOffset = 0;\r\n imageInfo.rgbByteLength = imageDesc!.rgbSliceByteLength;\r\n imageInfo.alphaByteOffset = imageDesc!.alphaSliceByteOffset > 0 ? imageDesc!.rgbSliceByteLength : 0;\r\n imageInfo.alphaByteLength = imageDesc!.alphaSliceByteLength;\r\n\r\n result = transcoder.transcodeImage(targetFormat, encodedData, imageInfo, 0, isVideo);\r\n } else {\r\n imageInfo.flags = 0;\r\n imageInfo.rgbByteOffset = 0;\r\n imageInfo.rgbByteLength = uncompressedByteLength;\r\n imageInfo.alphaByteOffset = 0;\r\n imageInfo.alphaByteLength = 0;\r\n\r\n result = transcoder.transcodeImage(targetFormat, encodedData, imageInfo, 0, ktx2Reader.hasAlpha, isVideo);\r\n }\r\n } finally {\r\n if (transcoder) {\r\n transcoder.delete();\r\n }\r\n\r\n if (imageInfo) {\r\n imageInfo.delete();\r\n }\r\n\r\n if (result && result.transcodedImage) {\r\n textureData = result.transcodedImage.get_typed_memory_view().slice();\r\n result.transcodedImage.delete();\r\n }\r\n }\r\n\r\n return textureData;\r\n });\r\n }\r\n}\r\n"]}
package/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./ktx2Decoder";
2
+ export * from "./ktx2FileReader";
3
+ export * from "./transcoder";
4
+ export * from "./transcoderManager";
5
+ export * from "./wasmMemoryManager";
6
+ export * from "./zstddec";
7
+ export * from "./Misc/index";
8
+ export * from "./Transcoders/index";
package/index.js ADDED
@@ -0,0 +1,10 @@
1
+ /* eslint-disable import/no-internal-modules */
2
+ export * from "./ktx2Decoder.js";
3
+ export * from "./ktx2FileReader.js";
4
+ export * from "./transcoder.js";
5
+ export * from "./transcoderManager.js";
6
+ export * from "./wasmMemoryManager.js";
7
+ export * from "./zstddec.js";
8
+ export * from "./Misc/index.js";
9
+ export * from "./Transcoders/index.js";
10
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/ktx2Decoder/src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./ktx2Decoder\";\r\nexport * from \"./ktx2FileReader\";\r\nexport * from \"./transcoder\";\r\nexport * from \"./transcoderManager\";\r\nexport * from \"./wasmMemoryManager\";\r\nexport * from \"./zstddec\";\r\nexport * from \"./Misc/index\";\r\nexport * from \"./Transcoders/index\";\r\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resources used for the implementation:
3
+ * - 3js KTX2 loader: https://github.com/mrdoob/three.js/blob/dfb5c23ce126ec845e4aa240599915fef5375797/examples/jsm/loaders/KTX2Loader.js
4
+ * - Universal Texture Transcoders: https://github.com/KhronosGroup/Universal-Texture-Transcoders
5
+ * - KTX2 specification: http://github.khronos.org/KTX-Specification/
6
+ * - KTX2 binaries to convert files: https://github.com/KhronosGroup/KTX-Software/releases
7
+ * - KTX specification: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html
8
+ * - KTX-Software: https://github.com/KhronosGroup/KTX-Software
9
+ */
10
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
11
+ /**
12
+ * Class for decoding KTX2 files
13
+ *
14
+ */
15
+ export declare class KTX2Decoder {
16
+ private _transcoderMgr;
17
+ private _zstdDecoder;
18
+ static DefaultDecoderOptions: KTX2.IKTX2DecoderOptions;
19
+ constructor();
20
+ decode(data: Uint8Array, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise<KTX2.IDecodedData>;
21
+ private _decodeData;
22
+ }
package/ktx2Decoder.js ADDED
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Resources used for the implementation:
3
+ * - 3js KTX2 loader: https://github.com/mrdoob/three.js/blob/dfb5c23ce126ec845e4aa240599915fef5375797/examples/jsm/loaders/KTX2Loader.js
4
+ * - Universal Texture Transcoders: https://github.com/KhronosGroup/Universal-Texture-Transcoders
5
+ * - KTX2 specification: http://github.khronos.org/KTX-Specification/
6
+ * - KTX2 binaries to convert files: https://github.com/KhronosGroup/KTX-Software/releases
7
+ * - KTX specification: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html
8
+ * - KTX-Software: https://github.com/KhronosGroup/KTX-Software
9
+ */
10
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
11
+ import { KTX2FileReader, SupercompressionScheme } from "./ktx2FileReader.js";
12
+ import { TranscoderManager } from "./transcoderManager.js";
13
+ import { LiteTranscoder_UASTC_ASTC } from "./Transcoders/liteTranscoder_UASTC_ASTC.js";
14
+ import { LiteTranscoder_UASTC_BC7 } from "./Transcoders/liteTranscoder_UASTC_BC7.js";
15
+ import { LiteTranscoder_UASTC_RGBA_UNORM } from "./Transcoders/liteTranscoder_UASTC_RGBA_UNORM.js";
16
+ import { LiteTranscoder_UASTC_RGBA_SRGB } from "./Transcoders/liteTranscoder_UASTC_RGBA_SRGB.js";
17
+ import { LiteTranscoder_UASTC_R8_UNORM } from "./Transcoders/liteTranscoder_UASTC_R8_UNORM.js";
18
+ import { LiteTranscoder_UASTC_RG8_UNORM } from "./Transcoders/liteTranscoder_UASTC_RG8_UNORM.js";
19
+ import { MSCTranscoder } from "./Transcoders/mscTranscoder.js";
20
+ import { ZSTDDecoder } from "./zstddec.js";
21
+ import { TranscodeDecisionTree } from "./transcodeDecisionTree.js";
22
+ const isPowerOfTwo = (value) => {
23
+ return (value & (value - 1)) === 0 && value !== 0;
24
+ };
25
+ /**
26
+ * Class for decoding KTX2 files
27
+ *
28
+ */
29
+ export class KTX2Decoder {
30
+ constructor() {
31
+ this._transcoderMgr = new TranscoderManager();
32
+ }
33
+ decode(data, caps, options) {
34
+ const finalOptions = { ...options, ...KTX2Decoder.DefaultDecoderOptions };
35
+ return Promise.resolve().then(() => {
36
+ const kfr = new KTX2FileReader(data);
37
+ if (!kfr.isValid()) {
38
+ throw new Error("Invalid KT2 file: wrong signature");
39
+ }
40
+ kfr.parse();
41
+ if (kfr.needZSTDDecoder) {
42
+ if (!this._zstdDecoder) {
43
+ this._zstdDecoder = new ZSTDDecoder();
44
+ }
45
+ return this._zstdDecoder.init().then(() => {
46
+ return this._decodeData(kfr, caps, finalOptions);
47
+ });
48
+ }
49
+ return this._decodeData(kfr, caps, finalOptions);
50
+ });
51
+ }
52
+ _decodeData(kfr, caps, options) {
53
+ const width = kfr.header.pixelWidth;
54
+ const height = kfr.header.pixelHeight;
55
+ const srcTexFormat = kfr.textureFormat;
56
+ const decisionTree = new TranscodeDecisionTree(srcTexFormat, kfr.hasAlpha, isPowerOfTwo(width) && isPowerOfTwo(height), caps, options);
57
+ if (options?.transcodeFormatDecisionTree) {
58
+ decisionTree.parseTree(options?.transcodeFormatDecisionTree);
59
+ }
60
+ const transcodeFormat = decisionTree.transcodeFormat;
61
+ const engineFormat = decisionTree.engineFormat;
62
+ const roundToMultiple4 = decisionTree.roundToMultiple4;
63
+ const transcoder = this._transcoderMgr.findTranscoder(srcTexFormat, transcodeFormat, kfr.isInGammaSpace, options?.bypassTranscoders);
64
+ if (transcoder === null) {
65
+ throw new Error(`no transcoder found to transcode source texture format "${KTX2.SourceTextureFormat[srcTexFormat]}" to format "${KTX2.TranscodeTarget[transcodeFormat]}"`);
66
+ }
67
+ const mipmaps = [];
68
+ const dataPromises = [];
69
+ const decodedData = {
70
+ width: 0,
71
+ height: 0,
72
+ transcodedFormat: engineFormat,
73
+ mipmaps,
74
+ isInGammaSpace: kfr.isInGammaSpace,
75
+ hasAlpha: kfr.hasAlpha,
76
+ transcoderName: transcoder.getName(),
77
+ };
78
+ let firstImageDescIndex = 0;
79
+ for (let level = 0; level < kfr.header.levelCount; level++) {
80
+ if (level > 0) {
81
+ firstImageDescIndex += Math.max(kfr.header.layerCount, 1) * kfr.header.faceCount * Math.max(kfr.header.pixelDepth >> (level - 1), 1);
82
+ }
83
+ const levelWidth = Math.floor(width / (1 << level)) || 1;
84
+ const levelHeight = Math.floor(height / (1 << level)) || 1;
85
+ const numImagesInLevel = kfr.header.faceCount; // note that cubemap are not supported yet (see KTX2FileReader), so faceCount == 1
86
+ const levelImageByteLength = ((levelWidth + 3) >> 2) * ((levelHeight + 3) >> 2) * kfr.dfdBlock.bytesPlane[0];
87
+ const levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;
88
+ let levelDataBuffer = kfr.data.buffer;
89
+ let levelDataOffset = kfr.levels[level].byteOffset + kfr.data.byteOffset;
90
+ let imageOffsetInLevel = 0;
91
+ if (kfr.header.supercompressionScheme === SupercompressionScheme.ZStandard) {
92
+ levelDataBuffer = this._zstdDecoder.decode(new Uint8Array(levelDataBuffer, levelDataOffset, kfr.levels[level].byteLength), levelUncompressedByteLength);
93
+ levelDataOffset = 0;
94
+ }
95
+ if (level === 0) {
96
+ decodedData.width = roundToMultiple4 ? (levelWidth + 3) & ~3 : levelWidth;
97
+ decodedData.height = roundToMultiple4 ? (levelHeight + 3) & ~3 : levelHeight;
98
+ }
99
+ for (let imageIndex = 0; imageIndex < numImagesInLevel; imageIndex++) {
100
+ let encodedData;
101
+ let imageDesc = null;
102
+ if (kfr.header.supercompressionScheme === SupercompressionScheme.BasisLZ) {
103
+ imageDesc = kfr.supercompressionGlobalData.imageDescs[firstImageDescIndex + imageIndex];
104
+ encodedData = new Uint8Array(levelDataBuffer, levelDataOffset + imageDesc.rgbSliceByteOffset, imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength);
105
+ }
106
+ else {
107
+ encodedData = new Uint8Array(levelDataBuffer, levelDataOffset + imageOffsetInLevel, levelImageByteLength);
108
+ imageOffsetInLevel += levelImageByteLength;
109
+ }
110
+ const mipmap = {
111
+ data: null,
112
+ width: levelWidth,
113
+ height: levelHeight,
114
+ };
115
+ const transcodedData = transcoder
116
+ .transcode(srcTexFormat, transcodeFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData)
117
+ .then((data) => {
118
+ mipmap.data = data;
119
+ return data;
120
+ })
121
+ .catch((reason) => {
122
+ decodedData.errors = decodedData.errors ?? "";
123
+ decodedData.errors += reason + "\n" + reason.stack + "\n";
124
+ return null;
125
+ });
126
+ dataPromises.push(transcodedData);
127
+ mipmaps.push(mipmap);
128
+ }
129
+ }
130
+ return Promise.all(dataPromises).then(() => {
131
+ return decodedData;
132
+ });
133
+ }
134
+ }
135
+ KTX2Decoder.DefaultDecoderOptions = {};
136
+ // Put in the order you want the transcoders to be used in priority
137
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_ASTC);
138
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_BC7);
139
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RGBA_UNORM);
140
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RGBA_SRGB);
141
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_R8_UNORM);
142
+ TranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RG8_UNORM);
143
+ TranscoderManager.RegisterTranscoder(MSCTranscoder); // catch all transcoder - will throw an error if the format can't be transcoded
144
+ //# sourceMappingURL=ktx2Decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ktx2Decoder.js","sourceRoot":"","sources":["../../../tools/ktx2Decoder/src/ktx2Decoder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Resources used for the implementation:\r\n * - 3js KTX2 loader: https://github.com/mrdoob/three.js/blob/dfb5c23ce126ec845e4aa240599915fef5375797/examples/jsm/loaders/KTX2Loader.js\r\n * - Universal Texture Transcoders: https://github.com/KhronosGroup/Universal-Texture-Transcoders\r\n * - KTX2 specification: http://github.khronos.org/KTX-Specification/\r\n * - KTX2 binaries to convert files: https://github.com/KhronosGroup/KTX-Software/releases\r\n * - KTX specification: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html\r\n * - KTX-Software: https://github.com/KhronosGroup/KTX-Software\r\n */\r\nimport * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport type { IKTX2_ImageDesc } from \"./ktx2FileReader\";\r\nimport { KTX2FileReader, SupercompressionScheme } from \"./ktx2FileReader\";\r\nimport { TranscoderManager } from \"./transcoderManager\";\r\nimport { LiteTranscoder_UASTC_ASTC } from \"./Transcoders/liteTranscoder_UASTC_ASTC\";\r\nimport { LiteTranscoder_UASTC_BC7 } from \"./Transcoders/liteTranscoder_UASTC_BC7\";\r\nimport { LiteTranscoder_UASTC_RGBA_UNORM } from \"./Transcoders/liteTranscoder_UASTC_RGBA_UNORM\";\r\nimport { LiteTranscoder_UASTC_RGBA_SRGB } from \"./Transcoders/liteTranscoder_UASTC_RGBA_SRGB\";\r\nimport { LiteTranscoder_UASTC_R8_UNORM } from \"./Transcoders/liteTranscoder_UASTC_R8_UNORM\";\r\nimport { LiteTranscoder_UASTC_RG8_UNORM } from \"./Transcoders/liteTranscoder_UASTC_RG8_UNORM\";\r\nimport { MSCTranscoder } from \"./Transcoders/mscTranscoder\";\r\nimport { ZSTDDecoder } from \"./zstddec\";\r\nimport { TranscodeDecisionTree } from \"./transcodeDecisionTree\";\r\n\r\nconst isPowerOfTwo = (value: number) => {\r\n return (value & (value - 1)) === 0 && value !== 0;\r\n};\r\n\r\n/**\r\n * Class for decoding KTX2 files\r\n *\r\n */\r\nexport class KTX2Decoder {\r\n private _transcoderMgr: TranscoderManager;\r\n private _zstdDecoder: ZSTDDecoder;\r\n\r\n public static DefaultDecoderOptions: KTX2.IKTX2DecoderOptions = {};\r\n\r\n constructor() {\r\n this._transcoderMgr = new TranscoderManager();\r\n }\r\n\r\n public decode(data: Uint8Array, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise<KTX2.IDecodedData> {\r\n const finalOptions = { ...options, ...KTX2Decoder.DefaultDecoderOptions };\r\n\r\n return Promise.resolve().then(() => {\r\n const kfr = new KTX2FileReader(data);\r\n\r\n if (!kfr.isValid()) {\r\n throw new Error(\"Invalid KT2 file: wrong signature\");\r\n }\r\n\r\n kfr.parse();\r\n\r\n if (kfr.needZSTDDecoder) {\r\n if (!this._zstdDecoder) {\r\n this._zstdDecoder = new ZSTDDecoder();\r\n }\r\n\r\n return this._zstdDecoder.init().then(() => {\r\n return this._decodeData(kfr, caps, finalOptions);\r\n });\r\n }\r\n\r\n return this._decodeData(kfr, caps, finalOptions);\r\n });\r\n }\r\n\r\n private _decodeData(kfr: KTX2FileReader, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise<KTX2.IDecodedData> {\r\n const width = kfr.header.pixelWidth;\r\n const height = kfr.header.pixelHeight;\r\n const srcTexFormat = kfr.textureFormat;\r\n\r\n const decisionTree = new TranscodeDecisionTree(srcTexFormat, kfr.hasAlpha, isPowerOfTwo(width) && isPowerOfTwo(height), caps, options);\r\n\r\n if (options?.transcodeFormatDecisionTree) {\r\n decisionTree.parseTree(options?.transcodeFormatDecisionTree);\r\n }\r\n\r\n const transcodeFormat = decisionTree.transcodeFormat;\r\n const engineFormat = decisionTree.engineFormat;\r\n const roundToMultiple4 = decisionTree.roundToMultiple4;\r\n\r\n const transcoder = this._transcoderMgr.findTranscoder(srcTexFormat, transcodeFormat, kfr.isInGammaSpace, options?.bypassTranscoders);\r\n\r\n if (transcoder === null) {\r\n throw new Error(\r\n `no transcoder found to transcode source texture format \"${KTX2.SourceTextureFormat[srcTexFormat]}\" to format \"${KTX2.TranscodeTarget[transcodeFormat]}\"`\r\n );\r\n }\r\n\r\n const mipmaps: Array<KTX2.IMipmap> = [];\r\n const dataPromises: Array<Promise<Uint8Array | null>> = [];\r\n const decodedData: KTX2.IDecodedData = {\r\n width: 0,\r\n height: 0,\r\n transcodedFormat: engineFormat,\r\n mipmaps,\r\n isInGammaSpace: kfr.isInGammaSpace,\r\n hasAlpha: kfr.hasAlpha,\r\n transcoderName: transcoder.getName(),\r\n };\r\n\r\n let firstImageDescIndex = 0;\r\n\r\n for (let level = 0; level < kfr.header.levelCount; level++) {\r\n if (level > 0) {\r\n firstImageDescIndex += Math.max(kfr.header.layerCount, 1) * kfr.header.faceCount * Math.max(kfr.header.pixelDepth >> (level - 1), 1);\r\n }\r\n\r\n const levelWidth = Math.floor(width / (1 << level)) || 1;\r\n const levelHeight = Math.floor(height / (1 << level)) || 1;\r\n\r\n const numImagesInLevel = kfr.header.faceCount; // note that cubemap are not supported yet (see KTX2FileReader), so faceCount == 1\r\n const levelImageByteLength = ((levelWidth + 3) >> 2) * ((levelHeight + 3) >> 2) * kfr.dfdBlock.bytesPlane[0];\r\n\r\n const levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;\r\n\r\n let levelDataBuffer = kfr.data.buffer;\r\n\r\n let levelDataOffset = kfr.levels[level].byteOffset + kfr.data.byteOffset;\r\n let imageOffsetInLevel = 0;\r\n\r\n if (kfr.header.supercompressionScheme === SupercompressionScheme.ZStandard) {\r\n levelDataBuffer = this._zstdDecoder.decode(new Uint8Array(levelDataBuffer, levelDataOffset, kfr.levels[level].byteLength), levelUncompressedByteLength);\r\n levelDataOffset = 0;\r\n }\r\n\r\n if (level === 0) {\r\n decodedData.width = roundToMultiple4 ? (levelWidth + 3) & ~3 : levelWidth;\r\n decodedData.height = roundToMultiple4 ? (levelHeight + 3) & ~3 : levelHeight;\r\n }\r\n\r\n for (let imageIndex = 0; imageIndex < numImagesInLevel; imageIndex++) {\r\n let encodedData: Uint8Array;\r\n let imageDesc: IKTX2_ImageDesc | null = null;\r\n\r\n if (kfr.header.supercompressionScheme === SupercompressionScheme.BasisLZ) {\r\n imageDesc = kfr.supercompressionGlobalData.imageDescs![firstImageDescIndex + imageIndex];\r\n\r\n encodedData = new Uint8Array(levelDataBuffer, levelDataOffset + imageDesc.rgbSliceByteOffset, imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength);\r\n } else {\r\n encodedData = new Uint8Array(levelDataBuffer, levelDataOffset + imageOffsetInLevel, levelImageByteLength);\r\n\r\n imageOffsetInLevel += levelImageByteLength;\r\n }\r\n\r\n const mipmap: KTX2.IMipmap = {\r\n data: null,\r\n width: levelWidth,\r\n height: levelHeight,\r\n };\r\n\r\n const transcodedData = transcoder\r\n .transcode(srcTexFormat, transcodeFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData)\r\n .then((data) => {\r\n mipmap.data = data;\r\n return data;\r\n })\r\n .catch((reason) => {\r\n decodedData.errors = decodedData.errors ?? \"\";\r\n decodedData.errors += reason + \"\\n\" + reason.stack + \"\\n\";\r\n return null;\r\n });\r\n\r\n dataPromises.push(transcodedData);\r\n\r\n mipmaps.push(mipmap);\r\n }\r\n }\r\n\r\n return Promise.all(dataPromises).then(() => {\r\n return decodedData;\r\n });\r\n }\r\n}\r\n\r\n// Put in the order you want the transcoders to be used in priority\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_ASTC);\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_BC7);\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RGBA_UNORM);\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RGBA_SRGB);\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_R8_UNORM);\r\nTranscoderManager.RegisterTranscoder(LiteTranscoder_UASTC_RG8_UNORM);\r\nTranscoderManager.RegisterTranscoder(MSCTranscoder); // catch all transcoder - will throw an error if the format can't be transcoded\r\n"]}
@@ -0,0 +1,109 @@
1
+ import * as KTX2 from "@babylonjs/core/Materials/Textures/ktx2decoderTypes.js";
2
+ /** @internal */
3
+ export declare enum SupercompressionScheme {
4
+ None = 0,
5
+ BasisLZ = 1,
6
+ ZStandard = 2,
7
+ ZLib = 3
8
+ }
9
+ /** @internal */
10
+ export interface IKTX2_Header {
11
+ vkFormat: number;
12
+ typeSize: number;
13
+ pixelWidth: number;
14
+ pixelHeight: number;
15
+ pixelDepth: number;
16
+ layerCount: number;
17
+ faceCount: number;
18
+ levelCount: number;
19
+ supercompressionScheme: number;
20
+ dfdByteOffset: number;
21
+ dfdByteLength: number;
22
+ kvdByteOffset: number;
23
+ kvdByteLength: number;
24
+ sgdByteOffset: number;
25
+ sgdByteLength: number;
26
+ }
27
+ /** @internal */
28
+ export interface IKTX2_Level {
29
+ byteOffset: number;
30
+ byteLength: number;
31
+ uncompressedByteLength: number;
32
+ }
33
+ interface IKTX2_Sample {
34
+ bitOffset: number;
35
+ bitLength: number;
36
+ channelType: number;
37
+ channelFlags: number;
38
+ samplePosition: number[];
39
+ sampleLower: number;
40
+ sampleUpper: number;
41
+ }
42
+ /** @internal */
43
+ export interface IKTX2_DFD {
44
+ vendorId: number;
45
+ descriptorType: number;
46
+ versionNumber: number;
47
+ descriptorBlockSize: number;
48
+ colorModel: number;
49
+ colorPrimaries: number;
50
+ transferFunction: number;
51
+ flags: number;
52
+ texelBlockDimension: {
53
+ x: number;
54
+ y: number;
55
+ z: number;
56
+ w: number;
57
+ };
58
+ bytesPlane: Array<number>;
59
+ numSamples: number;
60
+ samples: Array<IKTX2_Sample>;
61
+ }
62
+ /** @internal */
63
+ export interface IKTX2_ImageDesc {
64
+ imageFlags: number;
65
+ rgbSliceByteOffset: number;
66
+ rgbSliceByteLength: number;
67
+ alphaSliceByteOffset: number;
68
+ alphaSliceByteLength: number;
69
+ }
70
+ /** @internal */
71
+ export interface IKTX2_SupercompressionGlobalData {
72
+ endpointCount?: number;
73
+ selectorCount?: number;
74
+ endpointsByteLength?: number;
75
+ selectorsByteLength?: number;
76
+ tablesByteLength?: number;
77
+ extendedByteLength?: number;
78
+ imageDescs?: Array<IKTX2_ImageDesc>;
79
+ endpointsData?: Uint8Array;
80
+ selectorsData?: Uint8Array;
81
+ tablesData?: Uint8Array;
82
+ extendedData?: Uint8Array;
83
+ }
84
+ export declare class KTX2FileReader {
85
+ private _data;
86
+ private _header;
87
+ private _levels;
88
+ private _dfdBlock;
89
+ private _supercompressionGlobalData;
90
+ /**
91
+ * Will throw an exception if the file can't be parsed
92
+ * @param data
93
+ */
94
+ constructor(data: Uint8Array);
95
+ get data(): Uint8Array;
96
+ get header(): IKTX2_Header;
97
+ get levels(): Array<IKTX2_Level>;
98
+ get dfdBlock(): IKTX2_DFD;
99
+ get supercompressionGlobalData(): IKTX2_SupercompressionGlobalData;
100
+ isValid(): boolean;
101
+ parse(): void;
102
+ private _getImageCount;
103
+ get textureFormat(): KTX2.SourceTextureFormat;
104
+ get hasAlpha(): boolean;
105
+ get needZSTDDecoder(): boolean;
106
+ get isInGammaSpace(): boolean;
107
+ static IsValid(data: ArrayBufferView): boolean;
108
+ }
109
+ export {};