All files / engine/Source/Core KTX2Transcoder.js

97.05% Statements 33/34
70% Branches 7/10
85.71% Functions 6/7
96.77% Lines 30/31

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                          1x         1x     1x         1x 1x         1x     1x   21x     20x 1x     20x   20x 20x 20x   20x       20x     17x 17x   17x 21x 21x 21x 21x                     17x 17x 21x     17x 15x     17x     3x          
import Check from "./Check.js";
import CompressedTextureBuffer from "./CompressedTextureBuffer.js";
import defined from "./defined.js";
import RuntimeError from "./RuntimeError.js";
import TaskProcessor from "./TaskProcessor.js";
 
/**
 * Transcodes KTX2 textures using web workers.
 *
 * @private
 */
function KTX2Transcoder() {}
 
KTX2Transcoder._transcodeTaskProcessor = new TaskProcessor(
  "transcodeKTX2",
  Number.POSITIVE_INFINITY, // KTX2 transcoding is used in place of Resource.fetchImage, so it can't reject as "just soooo busy right now"
);
 
KTX2Transcoder._readyPromise = undefined;
 
function makeReadyPromise() {
  const readyPromise = KTX2Transcoder._transcodeTaskProcessor
    .initWebAssemblyModule({
      wasmBinaryFile: "ThirdParty/basis_transcoder.wasm",
    })
    .then(function (result) {
      Eif (result) {
        return KTX2Transcoder._transcodeTaskProcessor;
      }
 
      throw new RuntimeError("KTX2 transcoder could not be initialized.");
    });
  KTX2Transcoder._readyPromise = readyPromise;
}
 
KTX2Transcoder.transcode = function (ktx2Buffer, supportedTargetFormats) {
  //>>includeStart('debug', pragmas.debug);
  Check.defined("supportedTargetFormats", supportedTargetFormats);
  //>>includeEnd('debug');
 
  if (!defined(KTX2Transcoder._readyPromise)) {
    makeReadyPromise();
  }
 
  return KTX2Transcoder._readyPromise
    .then(function (taskProcessor) {
      let bufferView = ktx2Buffer;
      Eif (ktx2Buffer instanceof ArrayBuffer) {
        bufferView = new Uint8Array(ktx2Buffer);
      }
      const parameters = {
        supportedTargetFormats: supportedTargetFormats,
        ktx2Buffer: bufferView,
      };
      return taskProcessor.scheduleTask(parameters, [bufferView.buffer]);
    })
    .then(function (result) {
      const levelsLength = result.length;
      const faceKeys = Object.keys(result[0]);
 
      for (let i = 0; i < levelsLength; i++) {
        const faces = result[i];
        for (let j = 0; j < faceKeys.length; j++) {
          const face = faces[faceKeys[j]];
          faces[faceKeys[j]] = new CompressedTextureBuffer(
            face.internalFormat,
            face.datatype,
            face.width,
            face.height,
            face.levelBuffer,
          );
        }
      }
 
      // Cleaning up parsed result if it's a single image
      Eif (faceKeys.length === 1) {
        for (let i = 0; i < levelsLength; ++i) {
          result[i] = result[i][faceKeys[0]];
        }
 
        if (levelsLength === 1) {
          result = result[0];
        }
      }
      return result;
    })
    .catch(function (error) {
      throw error;
    });
};
 
export default KTX2Transcoder;