diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts index 5d679c840..b72b8eb8d 100644 --- a/packages/loader/src/index.ts +++ b/packages/loader/src/index.ts @@ -23,6 +23,6 @@ export * from "./SceneLoader"; export type { Texture2DParams } from "./Texture2DLoader"; export { parseSingleKTX } from "./compressed-texture"; export * from "./gltf"; -export { KTX2Loader } from "./ktx2/KTX2Loader"; +export { KTX2Loader, KTX2Transcoder } from "./ktx2/KTX2Loader"; export { KTX2TargetFormat } from "./ktx2/KTX2TargetFormat"; export * from "./resource-deserialize"; diff --git a/packages/loader/src/ktx2/KTX2Loader.ts b/packages/loader/src/ktx2/KTX2Loader.ts index 67fe48ee5..8ea6ab3f4 100644 --- a/packages/loader/src/ktx2/KTX2Loader.ts +++ b/packages/loader/src/ktx2/KTX2Loader.ts @@ -26,13 +26,22 @@ export class KTX2Loader extends Loader { private static _isBinomialInit: boolean = false; private static _binomialLLCTranscoder: BinomialLLCTranscoder; private static _khronosTranscoder: KhronosTranscoder; - private static _priorityFormats: KTX2TargetFormat[] = [ - KTX2TargetFormat.BC7, - KTX2TargetFormat.ASTC, - KTX2TargetFormat.BC1_BC3, - KTX2TargetFormat.ETC, - KTX2TargetFormat.PVRTC - ]; + private static _priorityFormats = { + etc1s: [ + KTX2TargetFormat.ETC, + KTX2TargetFormat.BC7, + KTX2TargetFormat.ASTC, + KTX2TargetFormat.BC1_BC3, + KTX2TargetFormat.PVRTC + ], + uastc: [ + KTX2TargetFormat.ASTC, + KTX2TargetFormat.BC7, + KTX2TargetFormat.ETC, + KTX2TargetFormat.BC1_BC3, + KTX2TargetFormat.PVRTC + ] + }; private static _supportedMap = { [KTX2TargetFormat.ASTC]: [GLCapabilityType.astc], [KTX2TargetFormat.ETC]: [GLCapabilityType.etc], @@ -55,7 +64,8 @@ export class KTX2Loader extends Loader { /** @internal */ static _parseBuffer(buffer: Uint8Array, engine: Engine, params?: KTX2Params) { const ktx2Container = new KTX2Container(buffer); - const formatPriorities = params?.priorityFormats ?? KTX2Loader._priorityFormats; + const formatPriorities = + params?.priorityFormats ?? KTX2Loader._priorityFormats[ktx2Container.isUASTC ? "uastc" : "etc1s"]; const targetFormat = KTX2Loader._decideTargetFormat(engine, ktx2Container, formatPriorities); let transcodeResultPromise: Promise; if (KTX2Loader._isBinomialInit || !KhronosTranscoder.transcoderMap[targetFormat] || !ktx2Container.isUASTC) { @@ -186,11 +196,15 @@ export class KTX2Loader extends Loader { } } - override initialize(engine: Engine, configuration: EngineConfiguration): Promise { + override initialize(_: Engine, configuration: EngineConfiguration): Promise { if (configuration.ktx2Loader) { const options = configuration.ktx2Loader; - if (options.priorityFormats) KTX2Loader._priorityFormats = options.priorityFormats; - if (this._isKhronosSupported(options.priorityFormats, engine) && options.workerCount !== 0) { + if (options.priorityFormats) { + KTX2Loader._priorityFormats["etc1s"] = options.priorityFormats; + KTX2Loader._priorityFormats["uastc"] = options.priorityFormats; + } + + if (options.transcoder === KTX2Transcoder.Khronos) { return KTX2Loader._getKhronosTranscoder(options.workerCount).init(); } else { return KTX2Loader._getBinomialLLCTranscoder(options.workerCount).init(); @@ -212,12 +226,6 @@ export class KTX2Loader extends Loader { ) ); } - - private _isKhronosSupported(priorityFormats: KTX2TargetFormat[], engine: any): boolean { - return !!KhronosTranscoder.transcoderMap[ - KTX2Loader._detectSupportedFormat(engine._hardwareRenderer, priorityFormats) - ]; - } } /** @@ -225,9 +233,18 @@ export class KTX2Loader extends Loader { */ export interface KTX2Params { /** Priority transcoding format queue which is preferred options, default is BC7/ASTC/BC3_BC1/ETC/PVRTC/R8G8B8A8. */ + /** @deprecated */ priorityFormats: KTX2TargetFormat[]; } +/** Used for initialize KTX2 transcoder. */ +export enum KTX2Transcoder { + /** BinomialLLC transcoder. */ + BinomialLLC, + /** Khronos transcoder. */ + Khronos +} + declare module "@galacean/engine-core" { interface EngineConfiguration { /** KTX2 loader options. */ @@ -235,7 +252,10 @@ declare module "@galacean/engine-core" { /** Worker count for transcoder, default is 4. */ workerCount?: number; /** Global transcoding format queue which will be used if not specified in per-instance param, default is BC7/ASTC/BC3_BC1/ETC/PVRTC/R8G8B8A8. */ + /** @deprecated */ priorityFormats?: KTX2TargetFormat[]; + /** Used for initialize KTX2 transcoder, default is BinomialLLC. */ + transcoder?: KTX2Transcoder; }; } }