Prechádzať zdrojové kódy

Added Zstandard decompression

Popov72 5 rokov pred
rodič
commit
2508c5705e

+ 16 - 3
ktx2Decoder/src/ktx2Decoder.ts

@@ -14,6 +14,7 @@ import { LiteTranscoder_UASTC_BC7 } from './Transcoders/liteTranscoder_UASTC_BC7
 import { MSCTranscoder } from './Transcoders/mscTranscoder';
 import { MSCTranscoder } from './Transcoders/mscTranscoder';
 import { transcodeTarget, sourceTextureFormat } from './transcoder';
 import { transcodeTarget, sourceTextureFormat } from './transcoder';
 import { Nullable } from './types';
 import { Nullable } from './types';
+import { ZSTDDecoder } from './zstddec';
 
 
 const COMPRESSED_RGBA_BPTC_UNORM_EXT = 0x8E8C;
 const COMPRESSED_RGBA_BPTC_UNORM_EXT = 0x8E8C;
 const COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0;
 const COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0;
@@ -58,6 +59,7 @@ const isPowerOfTwo = (value: number)  => {
 export class KTX2Decoder {
 export class KTX2Decoder {
 
 
     private _transcoderMgr: TranscoderManager;
     private _transcoderMgr: TranscoderManager;
+    private _zstdDecoder: ZSTDDecoder;
 
 
     constructor() {
     constructor() {
         this._transcoderMgr = new TranscoderManager();
         this._transcoderMgr = new TranscoderManager();
@@ -72,6 +74,18 @@ export class KTX2Decoder {
 
 
         kfr.parse();
         kfr.parse();
 
 
+        if (kfr.needZSTDDecoder && !this._zstdDecoder) {
+            this._zstdDecoder = new ZSTDDecoder();
+
+            return this._zstdDecoder.init().then(() => {
+                return this._decodeData(kfr, caps);
+            });
+        }
+
+        return this._decodeData(kfr, caps);
+    }
+
+    private _decodeData(kfr: KTX2FileReader, caps: ICompressedFormatCapabilities): Promise<IDecodedData> {
         const width = kfr.header.pixelWidth;
         const width = kfr.header.pixelWidth;
         const height = kfr.header.pixelHeight;
         const height = kfr.header.pixelHeight;
         const srcTexFormat = kfr.textureFormat;
         const srcTexFormat = kfr.textureFormat;
@@ -136,9 +150,8 @@ export class KTX2Decoder {
             let imageOffsetInLevel = 0;
             let imageOffsetInLevel = 0;
 
 
             if (kfr.header.supercompressionScheme === supercompressionScheme.ZStandard) {
             if (kfr.header.supercompressionScheme === supercompressionScheme.ZStandard) {
-                //levelDataBuffer = this.zstd.decode(new Uint8Array(levelDataBuffer, levelDataOffset, levelByteLength), levelUncompressedByteLength);
-                //levelDataOffset = 0;
-                throw new Error("ZStandard supercompression scheme is not supported yet");
+                levelDataBuffer = this._zstdDecoder.decode(new Uint8Array(levelDataBuffer, levelDataOffset, kfr.levels[level].byteLength), levelUncompressedByteLength);
+                levelDataOffset = 0;
             }
             }
 
 
             if (level === 0) {
             if (level === 0) {

+ 7 - 9
ktx2Decoder/src/ktx2FileReader.ts

@@ -335,18 +335,16 @@ export class KTX2FileReader {
         return false;
         return false;
     }
     }
 
 
-    public getHasAlpha(): boolean {
-        const tformat = this.textureFormat;
-
-        switch (tformat) {
-            case sourceTextureFormat.ETC1S:
-                return this._dfdBlock.numSamples === 2 && (this._dfdBlock.samples[0].channelType === dfdChannel_ETC1S.AAA || this._dfdBlock.samples[1].channelType === dfdChannel_ETC1S.AAA);
+    public needZSTDDecoder(): boolean {
+        let needZSTDDecoder = false;
 
 
-            case sourceTextureFormat.UASTC4x4:
-                return this._dfdBlock.samples[0].channelType === dfdChannel_UASTC.RGBA;
+        for (let level = 0; level < this._header.levelCount && !needZSTDDecoder; level ++) {
+            if (this._header.supercompressionScheme === supercompressionScheme.ZStandard) {
+                needZSTDDecoder = true;
+            }
         }
         }
 
 
-        return false;
+        return needZSTDDecoder;
     }
     }
 
 
     public static IsValid(data: ArrayBufferView): boolean {
     public static IsValid(data: ArrayBufferView): boolean {

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 130 - 0
ktx2Decoder/src/zstddec.ts


+ 2 - 1
src/Misc/khronosTextureContainer2.ts

@@ -14,7 +14,8 @@ export class KhronosTextureContainer2 {
     /**
     /**
      * URL to use when loading the KTX2 decoder module
      * URL to use when loading the KTX2 decoder module
      */
      */
-    public static JSModuleURL = "https://preview.babylonjs.com/ktx2Decoder/babylon.ktx2Decoder.js";
+    //public static JSModuleURL = "https://preview.babylonjs.com/ktx2Decoder/babylon.ktx2Decoder.js";
+    public static JSModuleURL = "https://popov72.github.io/BabylonDev/resources/lib/babylon.ktx2Decoder.js";
 
 
     private _engine: ThinEngine;
     private _engine: ThinEngine;