@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
93 lines (80 loc) • 2.67 kB
JavaScript
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) {
if (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;
if (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
if (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;