@babylonjs/ktx2decoder 9.19.1 → 9.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ktx2Decoder.js CHANGED
@@ -91,12 +91,14 @@ export class KTX2Decoder {
91
91
  const levelWidth = Math.floor(width / (1 << level)) || 1;
92
92
  const levelHeight = Math.floor(height / (1 << level)) || 1;
93
93
  const numImagesInLevel = kfr.header.faceCount; // note that cubemap are not supported yet (see KTX2FileReader), so faceCount == 1
94
- // The texel block dimension is 4x4 for the block-compressed source formats and 1x1 for the uncompressed ones,
95
- // so this covers both without special casing.
94
+ const levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;
95
+ // bytesPlane[0] is 0 for supercompressed formats (e.g. UASTC + Zstd); fall back to uncompressedByteLength.
96
96
  const blockWidth = kfr.dfdBlock.texelBlockDimension.x;
97
97
  const blockHeight = kfr.dfdBlock.texelBlockDimension.y;
98
- const levelImageByteLength = Math.ceil(levelWidth / blockWidth) * Math.ceil(levelHeight / blockHeight) * kfr.dfdBlock.bytesPlane[0];
99
- const levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;
98
+ const bytesPerBlock = kfr.dfdBlock.bytesPlane[0];
99
+ const levelImageByteLength = bytesPerBlock > 0
100
+ ? Math.ceil(levelWidth / blockWidth) * Math.ceil(levelHeight / blockHeight) * bytesPerBlock
101
+ : Math.floor(levelUncompressedByteLength / (layerCount * numImagesInLevel));
100
102
  let levelDataBuffer = kfr.data.buffer;
101
103
  let levelDataOffset = kfr.levels[level].byteOffset + kfr.data.byteOffset;
102
104
  let imageOffsetInLevel = 0;
@@ -1 +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\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nimport * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { type IKTX2_ImageDesc, 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 { UncompressedRGBA32Transcoder } from \"./Transcoders/uncompressedRGBA32Transcoder\";\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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async decode(data: Uint8Array, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise<KTX2.IDecodedData> {\r\n const finalOptions = { ...options, ...KTX2Decoder.DefaultDecoderOptions };\r\n\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 await this._zstdDecoder.init();\r\n return await this._decodeDataAsync(kfr, caps, finalOptions);\r\n }\r\n\r\n return await this._decodeDataAsync(kfr, caps, finalOptions);\r\n }\r\n\r\n private async _decodeDataAsync(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 layerCount = Math.max(kfr.header.layerCount, 1);\r\n const decodedData: KTX2.IDecodedData = {\r\n width: 0,\r\n height: 0,\r\n transcodedFormat: engineFormat,\r\n mipmaps,\r\n layerCount,\r\n isInGammaSpace: kfr.isInGammaSpace,\r\n hasAlpha: kfr.hasAlpha,\r\n transcoderName: transcoder.getName(),\r\n };\r\n\r\n // The image descriptors are only read when the file carries supercompression global data, so a file that\r\n // declares BasisLZ without any would otherwise fail deep in the loop below with an opaque type error.\r\n const imageDescs = kfr.supercompressionGlobalData.imageDescs;\r\n\r\n if (kfr.header.supercompressionScheme === SupercompressionScheme.BasisLZ && !imageDescs) {\r\n throw new Error(\"Invalid KTX2 file: BasisLZ supercompression is declared but the file has no supercompression global data.\");\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 // The texel block dimension is 4x4 for the block-compressed source formats and 1x1 for the uncompressed ones,\r\n // so this covers both without special casing.\r\n const blockWidth = kfr.dfdBlock.texelBlockDimension.x;\r\n const blockHeight = kfr.dfdBlock.texelBlockDimension.y;\r\n const levelImageByteLength = Math.ceil(levelWidth / blockWidth) * Math.ceil(levelHeight / blockHeight) * kfr.dfdBlock.bytesPlane[0];\r\n\r\n const levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;\r\n\r\n let levelDataBuffer: ArrayBufferLike = 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 // The decompressed level is a view that does not necessarily start at the beginning of its backing\r\n // buffer, so keep the buffer and its offset separately. Passing the view itself to the Uint8Array\r\n // constructor below would silently copy the whole level and ignore the offset/length arguments.\r\n const decompressedLevel = this._zstdDecoder.decode(new Uint8Array(levelDataBuffer, levelDataOffset, kfr.levels[level].byteLength), levelUncompressedByteLength);\r\n levelDataBuffer = decompressedLevel.buffer;\r\n levelDataOffset = decompressedLevel.byteOffset;\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 // Within a level, images are stored layer-major: for each layer, for each face, for each z-slice.\r\n // Iterating in that same order keeps both the BasisLZ image descriptor index and the sequential\r\n // byte offset used by the other supercompression schemes in step with the file layout.\r\n for (let layerIndex = 0; layerIndex < layerCount; layerIndex++) {\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 = imageDescs![firstImageDescIndex + layerIndex * numImagesInLevel + imageIndex];\r\n\r\n encodedData = new Uint8Array(\r\n levelDataBuffer,\r\n levelDataOffset + imageDesc.rgbSliceByteOffset,\r\n imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength\r\n );\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 layerIndex,\r\n };\r\n\r\n const transcodedData = transcoder\r\n .transcode(srcTexFormat, transcodeFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData)\r\n // eslint-disable-next-line github/no-then\r\n .then((data) => {\r\n mipmap.data = data;\r\n return data;\r\n })\r\n // eslint-disable-next-line github/no-then\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\r\n await Promise.all(dataPromises);\r\n return decodedData;\r\n }\r\n}\r\n\r\n// Put in the order you want the transcoders to be used in priority\r\nTranscoderManager.RegisterTranscoder(UncompressedRGBA32Transcoder);\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"]}
1
+ {"version":3,"file":"ktx2Decoder.js","sourceRoot":"","sources":["../../../tools/ktx2Decoder/src/ktx2Decoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,gEAAgE;AAChE,OAAO,KAAK,IAAI,MAAM,0CAA0C,CAAC;AAEjE,OAAO,EAAwB,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,+CAA+C,CAAC;AAChG,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,WAAW;IAMpB;QACI,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAED,gEAAgE;IACzD,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,IAAwC,EAAE,OAAkC;QAC9G,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;QAE1E,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;YAC1C,CAAC;YAED,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAmB,EAAE,IAAwC,EAAE,OAAkC;QAC5H,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;QACtC,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC;QAEvC,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEvI,IAAI,OAAO,EAAE,2BAA2B,EAAE,CAAC;YACvC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC;QACrD,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;QAC/C,MAAM,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,CAAC;QAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAErI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACX,2DAA2D,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,CAC5J,CAAC;QACN,CAAC;QAED,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,MAAM,YAAY,GAAsC,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,WAAW,GAAsB;YACnC,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,gBAAgB,EAAE,YAAY;YAC9B,OAAO;YACP,UAAU;YACV,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,cAAc,EAAE,UAAU,CAAC,OAAO,EAAE;SACvC,CAAC;QAEF,yGAAyG;QACzG,sGAAsG;QACtG,MAAM,UAAU,GAAG,GAAG,CAAC,0BAA0B,CAAC,UAAU,CAAC;QAE7D,IAAI,GAAG,CAAC,MAAM,CAAC,sBAAsB,KAAK,sBAAsB,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAC;QACjI,CAAC;QAED,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAE5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;YACzD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACZ,mBAAmB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzI,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3D,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,kFAAkF;YACjI,MAAM,2BAA2B,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC;YAE7E,2GAA2G;YAC3G,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,oBAAoB,GACtB,aAAa,GAAG,CAAC;gBACb,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,aAAa;gBAC3F,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC;YAEpF,IAAI,eAAe,GAAoB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAEvD,IAAI,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YACzE,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAE3B,IAAI,GAAG,CAAC,MAAM,CAAC,sBAAsB,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;gBACzE,mGAAmG;gBACnG,kGAAkG;gBAClG,gGAAgG;gBAChG,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,eAAe,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,2BAA2B,CAAC,CAAC;gBAChK,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC;gBAC3C,eAAe,GAAG,iBAAiB,CAAC,UAAU,CAAC;YACnD,CAAC;YAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACd,WAAW,CAAC,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC1E,WAAW,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YACjF,CAAC;YAED,kGAAkG;YAClG,gGAAgG;YAChG,uFAAuF;YACvF,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;gBAC7D,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,gBAAgB,EAAE,UAAU,EAAE,EAAE,CAAC;oBACnE,IAAI,WAAuB,CAAC;oBAC5B,IAAI,SAAS,GAA2B,IAAI,CAAC;oBAE7C,IAAI,GAAG,CAAC,MAAM,CAAC,sBAAsB,KAAK,sBAAsB,CAAC,OAAO,EAAE,CAAC;wBACvE,SAAS,GAAG,UAAW,CAAC,mBAAmB,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC,CAAC;wBAE1F,WAAW,GAAG,IAAI,UAAU,CACxB,eAAe,EACf,eAAe,GAAG,SAAS,CAAC,kBAAkB,EAC9C,SAAS,CAAC,kBAAkB,GAAG,SAAS,CAAC,oBAAoB,CAChE,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACJ,WAAW,GAAG,IAAI,UAAU,CAAC,eAAe,EAAE,eAAe,GAAG,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;wBAE1G,kBAAkB,IAAI,oBAAoB,CAAC;oBAC/C,CAAC;oBAED,MAAM,MAAM,GAAiB;wBACzB,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,UAAU;wBACjB,MAAM,EAAE,WAAW;wBACnB,UAAU;qBACb,CAAC;oBAEF,MAAM,cAAc,GAAG,UAAU;yBAC5B,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,2BAA2B,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC;wBACnI,0CAA0C;yBACzC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACX,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;wBACnB,OAAO,IAAI,CAAC;oBAChB,CAAC,CAAC;wBACF,0CAA0C;yBACzC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;wBACd,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;wBAC9C,WAAW,CAAC,MAAM,IAAI,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;wBAC1D,OAAO,IAAI,CAAC;oBAChB,CAAC,CAAC,CAAC;oBAEP,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAElC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChC,OAAO,WAAW,CAAC;IACvB,CAAC;;AAxKa,iCAAqB,GAA6B,EAAE,CAAC;AA2KvE,mEAAmE;AACnE,iBAAiB,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;AACnE,iBAAiB,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;AAChE,iBAAiB,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC;AAC/D,iBAAiB,CAAC,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;AACtE,iBAAiB,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;AACrE,iBAAiB,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;AACpE,iBAAiB,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;AACrE,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,+EAA+E","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\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nimport * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { type IKTX2_ImageDesc, 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 { UncompressedRGBA32Transcoder } from \"./Transcoders/uncompressedRGBA32Transcoder\";\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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async decode(data: Uint8Array, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise<KTX2.IDecodedData> {\r\n const finalOptions = { ...options, ...KTX2Decoder.DefaultDecoderOptions };\r\n\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 await this._zstdDecoder.init();\r\n return await this._decodeDataAsync(kfr, caps, finalOptions);\r\n }\r\n\r\n return await this._decodeDataAsync(kfr, caps, finalOptions);\r\n }\r\n\r\n private async _decodeDataAsync(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 layerCount = Math.max(kfr.header.layerCount, 1);\r\n const decodedData: KTX2.IDecodedData = {\r\n width: 0,\r\n height: 0,\r\n transcodedFormat: engineFormat,\r\n mipmaps,\r\n layerCount,\r\n isInGammaSpace: kfr.isInGammaSpace,\r\n hasAlpha: kfr.hasAlpha,\r\n transcoderName: transcoder.getName(),\r\n };\r\n\r\n // The image descriptors are only read when the file carries supercompression global data, so a file that\r\n // declares BasisLZ without any would otherwise fail deep in the loop below with an opaque type error.\r\n const imageDescs = kfr.supercompressionGlobalData.imageDescs;\r\n\r\n if (kfr.header.supercompressionScheme === SupercompressionScheme.BasisLZ && !imageDescs) {\r\n throw new Error(\"Invalid KTX2 file: BasisLZ supercompression is declared but the file has no supercompression global data.\");\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 levelUncompressedByteLength = kfr.levels[level].uncompressedByteLength;\r\n\r\n // bytesPlane[0] is 0 for supercompressed formats (e.g. UASTC + Zstd); fall back to uncompressedByteLength.\r\n const blockWidth = kfr.dfdBlock.texelBlockDimension.x;\r\n const blockHeight = kfr.dfdBlock.texelBlockDimension.y;\r\n const bytesPerBlock = kfr.dfdBlock.bytesPlane[0];\r\n const levelImageByteLength =\r\n bytesPerBlock > 0\r\n ? Math.ceil(levelWidth / blockWidth) * Math.ceil(levelHeight / blockHeight) * bytesPerBlock\r\n : Math.floor(levelUncompressedByteLength / (layerCount * numImagesInLevel));\r\n\r\n let levelDataBuffer: ArrayBufferLike = 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 // The decompressed level is a view that does not necessarily start at the beginning of its backing\r\n // buffer, so keep the buffer and its offset separately. Passing the view itself to the Uint8Array\r\n // constructor below would silently copy the whole level and ignore the offset/length arguments.\r\n const decompressedLevel = this._zstdDecoder.decode(new Uint8Array(levelDataBuffer, levelDataOffset, kfr.levels[level].byteLength), levelUncompressedByteLength);\r\n levelDataBuffer = decompressedLevel.buffer;\r\n levelDataOffset = decompressedLevel.byteOffset;\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 // Within a level, images are stored layer-major: for each layer, for each face, for each z-slice.\r\n // Iterating in that same order keeps both the BasisLZ image descriptor index and the sequential\r\n // byte offset used by the other supercompression schemes in step with the file layout.\r\n for (let layerIndex = 0; layerIndex < layerCount; layerIndex++) {\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 = imageDescs![firstImageDescIndex + layerIndex * numImagesInLevel + imageIndex];\r\n\r\n encodedData = new Uint8Array(\r\n levelDataBuffer,\r\n levelDataOffset + imageDesc.rgbSliceByteOffset,\r\n imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength\r\n );\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 layerIndex,\r\n };\r\n\r\n const transcodedData = transcoder\r\n .transcode(srcTexFormat, transcodeFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData)\r\n // eslint-disable-next-line github/no-then\r\n .then((data) => {\r\n mipmap.data = data;\r\n return data;\r\n })\r\n // eslint-disable-next-line github/no-then\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\r\n await Promise.all(dataPromises);\r\n return decodedData;\r\n }\r\n}\r\n\r\n// Put in the order you want the transcoders to be used in priority\r\nTranscoderManager.RegisterTranscoder(UncompressedRGBA32Transcoder);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/ktx2decoder",
3
- "version": "9.19.1",
3
+ "version": "9.20.1",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "postcompile": "build-tools -c add-js-to-es6 && build-tools -c cp -f \"../../../tools/babylonServer/public/ktx2Transcoders/1\" -t ./wasm && build-tools -c cp -f \"../../../tools/babylonServer/public/zstddec.wasm\" -t ./wasm"
21
21
  },
22
22
  "devDependencies": {
23
- "@babylonjs/core": "9.19.1",
23
+ "@babylonjs/core": "9.20.1",
24
24
  "@dev/build-tools": "^1.0.0",
25
25
  "@tools/ktx2decoder": "^1.0.0"
26
26
  },
package/transcoder.js CHANGED
@@ -43,6 +43,6 @@ Transcoder.WasmBaseUrl = "";
43
43
  * When set, unversioned CDN URLs will be rewritten to include this version prefix.
44
44
  * @internal
45
45
  */
46
- Transcoder.CdnVersion = "9.19.1";
46
+ Transcoder.CdnVersion = "9.20.1";
47
47
  Transcoder._DefaultCdnUrl = "https://cdn.babylonjs.com";
48
48
  //# sourceMappingURL=transcoder.js.map
package/transcoder.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"transcoder.js","sourceRoot":"","sources":["../../../tools/ktx2Decoder/src/transcoder.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,OAAO,UAAU;IACZ,MAAM,CAAC,YAAY,CAAC,GAA6B,EAAE,GAAyB,EAAE,cAAuB;QACxG,OAAO,KAAK,CAAC;IACjB,CAAC;IAgBM,MAAM,CAAC,UAAU,CAAC,OAAe;QACpC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzB,yBAAyB;gBACzB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;gBACpH,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,aAAa,GAAG,GAAG,UAAU,CAAC,cAAc,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/E,iFAAiF;gBACjF,kEAAkE;gBAClE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,OAAO;QACV,OAAO,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IAEM,UAAU,KAAU,CAAC;IAErB,iBAAiB;QACpB,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,gBAAgB,CAAC,SAA4B,IAAS,CAAC;IAEvD,KAAK,CAAC,SAAS,CAClB,GAA6B,EAC7B,GAAyB,EACzB,KAAa,EACb,KAAa,EACb,MAAc,EACd,sBAA8B,EAC9B,UAA0B,EAC1B,SAAiC,EACjC,WAAuB;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;;AAxDa,eAAI,GAAG,YAAY,CAAC;AAEpB,sBAAW,GAAG,EAAE,CAAC;AAE/B;;;;;GAKG;AACW,qBAAU,GAAG,QAAQ,CAAC;AAEZ,yBAAc,GAAG,2BAA2B,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { type WASMMemoryManager } from \"./wasmMemoryManager\";\r\nimport { type KTX2FileReader, type IKTX2_ImageDesc } from \"./ktx2FileReader\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class Transcoder {\r\n public static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean {\r\n return false;\r\n }\r\n\r\n public static Name = \"Transcoder\";\r\n\r\n public static WasmBaseUrl = \"\";\r\n\r\n /**\r\n * The CDN version to use when constructing versioned CDN URLs.\r\n * Injected at build time by the version update script.\r\n * When set, unversioned CDN URLs will be rewritten to include this version prefix.\r\n * @internal\r\n */\r\n public static CdnVersion = \"9.19.1\";\r\n\r\n private static readonly _DefaultCdnUrl = \"https://cdn.babylonjs.com\";\r\n\r\n public static GetWasmUrl(wasmUrl: string) {\r\n if (wasmUrl.startsWith(Transcoder._DefaultCdnUrl)) {\r\n if (Transcoder.WasmBaseUrl) {\r\n // Normalize the base url\r\n const baseUrl = Transcoder.WasmBaseUrl.endsWith(\"/\") ? Transcoder.WasmBaseUrl.slice(0, -1) : Transcoder.WasmBaseUrl;\r\n wasmUrl = wasmUrl.replace(Transcoder._DefaultCdnUrl, baseUrl);\r\n } else if (Transcoder.CdnVersion) {\r\n const versionedBase = `${Transcoder._DefaultCdnUrl}/v${Transcoder.CdnVersion}`;\r\n // Guard against double-versioning if the URL already contains the version prefix\r\n // (e.g. when GetWasmUrl is called multiple times on the same URL)\r\n if (!wasmUrl.startsWith(versionedBase)) {\r\n wasmUrl = wasmUrl.replace(Transcoder._DefaultCdnUrl, versionedBase);\r\n }\r\n }\r\n }\r\n return wasmUrl;\r\n }\r\n\r\n public getName(): string {\r\n return Transcoder.Name;\r\n }\r\n\r\n public initialize(): void {}\r\n\r\n public needMemoryManager(): boolean {\r\n return false;\r\n }\r\n\r\n public setMemoryManager(memoryMgr: WASMMemoryManager): void {}\r\n\r\n public async 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 null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"transcoder.js","sourceRoot":"","sources":["../../../tools/ktx2Decoder/src/transcoder.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,OAAO,UAAU;IACZ,MAAM,CAAC,YAAY,CAAC,GAA6B,EAAE,GAAyB,EAAE,cAAuB;QACxG,OAAO,KAAK,CAAC;IACjB,CAAC;IAgBM,MAAM,CAAC,UAAU,CAAC,OAAe;QACpC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzB,yBAAyB;gBACzB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;gBACpH,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,aAAa,GAAG,GAAG,UAAU,CAAC,cAAc,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/E,iFAAiF;gBACjF,kEAAkE;gBAClE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,OAAO;QACV,OAAO,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IAEM,UAAU,KAAU,CAAC;IAErB,iBAAiB;QACpB,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,gBAAgB,CAAC,SAA4B,IAAS,CAAC;IAEvD,KAAK,CAAC,SAAS,CAClB,GAA6B,EAC7B,GAAyB,EACzB,KAAa,EACb,KAAa,EACb,MAAc,EACd,sBAA8B,EAC9B,UAA0B,EAC1B,SAAiC,EACjC,WAAuB;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;;AAxDa,eAAI,GAAG,YAAY,CAAC;AAEpB,sBAAW,GAAG,EAAE,CAAC;AAE/B;;;;;GAKG;AACW,qBAAU,GAAG,QAAQ,CAAC;AAEZ,yBAAc,GAAG,2BAA2B,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type * as KTX2 from \"core/Materials/Textures/ktx2decoderTypes\";\r\n\r\nimport { type WASMMemoryManager } from \"./wasmMemoryManager\";\r\nimport { type KTX2FileReader, type IKTX2_ImageDesc } from \"./ktx2FileReader\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class Transcoder {\r\n public static CanTranscode(src: KTX2.SourceTextureFormat, dst: KTX2.TranscodeTarget, isInGammaSpace: boolean): boolean {\r\n return false;\r\n }\r\n\r\n public static Name = \"Transcoder\";\r\n\r\n public static WasmBaseUrl = \"\";\r\n\r\n /**\r\n * The CDN version to use when constructing versioned CDN URLs.\r\n * Injected at build time by the version update script.\r\n * When set, unversioned CDN URLs will be rewritten to include this version prefix.\r\n * @internal\r\n */\r\n public static CdnVersion = \"9.20.1\";\r\n\r\n private static readonly _DefaultCdnUrl = \"https://cdn.babylonjs.com\";\r\n\r\n public static GetWasmUrl(wasmUrl: string) {\r\n if (wasmUrl.startsWith(Transcoder._DefaultCdnUrl)) {\r\n if (Transcoder.WasmBaseUrl) {\r\n // Normalize the base url\r\n const baseUrl = Transcoder.WasmBaseUrl.endsWith(\"/\") ? Transcoder.WasmBaseUrl.slice(0, -1) : Transcoder.WasmBaseUrl;\r\n wasmUrl = wasmUrl.replace(Transcoder._DefaultCdnUrl, baseUrl);\r\n } else if (Transcoder.CdnVersion) {\r\n const versionedBase = `${Transcoder._DefaultCdnUrl}/v${Transcoder.CdnVersion}`;\r\n // Guard against double-versioning if the URL already contains the version prefix\r\n // (e.g. when GetWasmUrl is called multiple times on the same URL)\r\n if (!wasmUrl.startsWith(versionedBase)) {\r\n wasmUrl = wasmUrl.replace(Transcoder._DefaultCdnUrl, versionedBase);\r\n }\r\n }\r\n }\r\n return wasmUrl;\r\n }\r\n\r\n public getName(): string {\r\n return Transcoder.Name;\r\n }\r\n\r\n public initialize(): void {}\r\n\r\n public needMemoryManager(): boolean {\r\n return false;\r\n }\r\n\r\n public setMemoryManager(memoryMgr: WASMMemoryManager): void {}\r\n\r\n public async 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 null;\r\n }\r\n}\r\n"]}