This commit is contained in:
Akko
2025-08-04 18:57:35 +02:00
parent 8cf6e78a79
commit 9495868c2e
5030 changed files with 518594 additions and 17609 deletions

View File

@@ -0,0 +1,2 @@
import type { FormatDetectionParser } from '../../assets/detections/types';
export declare const detectBasis: FormatDetectionParser;

View File

@@ -0,0 +1,25 @@
'use strict';
var Extensions = require('../../extensions/Extensions.js');
var isWebGLSupported = require('../../utils/browser/isWebGLSupported.js');
var isWebGPUSupported = require('../../utils/browser/isWebGPUSupported.js');
"use strict";
const detectBasis = {
extension: {
type: Extensions.ExtensionType.DetectionParser,
priority: 3
},
test: async () => {
if (await isWebGPUSupported.isWebGPUSupported())
return true;
if (isWebGLSupported.isWebGLSupported())
return true;
return false;
},
add: async (formats) => [...formats, "basis"],
remove: async (formats) => formats.filter((f) => f !== "basis")
};
exports.detectBasis = detectBasis;
//# sourceMappingURL=detectBasis.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"detectBasis.js","sources":["../../../src/compressed-textures/basis/detectBasis.ts"],"sourcesContent":["import { ExtensionType } from '../../extensions/Extensions';\nimport { isWebGLSupported } from '../../utils/browser/isWebGLSupported';\nimport { isWebGPUSupported } from '../../utils/browser/isWebGPUSupported';\n\nimport type { FormatDetectionParser } from '../../assets/detections/types';\n\nexport const detectBasis = {\n extension: {\n type: ExtensionType.DetectionParser,\n priority: 3,\n },\n test: async (): Promise<boolean> =>\n {\n if (await isWebGPUSupported()) return true;\n if (isWebGLSupported()) return true;\n\n return false;\n },\n add: async (formats) => [...formats, 'basis'],\n remove: async (formats) => formats.filter((f) => f !== 'basis'),\n} as FormatDetectionParser;\n"],"names":["ExtensionType","isWebGPUSupported","isWebGLSupported"],"mappings":";;;;;;;AAMO,MAAM,WAAc,GAAA;AAAA,EACvB,SAAW,EAAA;AAAA,IACP,MAAMA,wBAAc,CAAA,eAAA;AAAA,IACpB,QAAU,EAAA,CAAA;AAAA,GACd;AAAA,EACA,MAAM,YACN;AACI,IAAA,IAAI,MAAMC,mCAAkB,EAAA;AAAG,MAAO,OAAA,IAAA,CAAA;AACtC,IAAA,IAAIC,iCAAiB,EAAA;AAAG,MAAO,OAAA,IAAA,CAAA;AAE/B,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EACA,KAAK,OAAO,OAAA,KAAY,CAAC,GAAG,SAAS,OAAO,CAAA;AAAA,EAC5C,MAAA,EAAQ,OAAO,OAAY,KAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AAClE;;;;"}

View File

@@ -0,0 +1,23 @@
import { ExtensionType } from '../../extensions/Extensions.mjs';
import { isWebGLSupported } from '../../utils/browser/isWebGLSupported.mjs';
import { isWebGPUSupported } from '../../utils/browser/isWebGPUSupported.mjs';
"use strict";
const detectBasis = {
extension: {
type: ExtensionType.DetectionParser,
priority: 3
},
test: async () => {
if (await isWebGPUSupported())
return true;
if (isWebGLSupported())
return true;
return false;
},
add: async (formats) => [...formats, "basis"],
remove: async (formats) => formats.filter((f) => f !== "basis")
};
export { detectBasis };
//# sourceMappingURL=detectBasis.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"detectBasis.mjs","sources":["../../../src/compressed-textures/basis/detectBasis.ts"],"sourcesContent":["import { ExtensionType } from '../../extensions/Extensions';\nimport { isWebGLSupported } from '../../utils/browser/isWebGLSupported';\nimport { isWebGPUSupported } from '../../utils/browser/isWebGPUSupported';\n\nimport type { FormatDetectionParser } from '../../assets/detections/types';\n\nexport const detectBasis = {\n extension: {\n type: ExtensionType.DetectionParser,\n priority: 3,\n },\n test: async (): Promise<boolean> =>\n {\n if (await isWebGPUSupported()) return true;\n if (isWebGLSupported()) return true;\n\n return false;\n },\n add: async (formats) => [...formats, 'basis'],\n remove: async (formats) => formats.filter((f) => f !== 'basis'),\n} as FormatDetectionParser;\n"],"names":[],"mappings":";;;;;AAMO,MAAM,WAAc,GAAA;AAAA,EACvB,SAAW,EAAA;AAAA,IACP,MAAM,aAAc,CAAA,eAAA;AAAA,IACpB,QAAU,EAAA,CAAA;AAAA,GACd;AAAA,EACA,MAAM,YACN;AACI,IAAA,IAAI,MAAM,iBAAkB,EAAA;AAAG,MAAO,OAAA,IAAA,CAAA;AACtC,IAAA,IAAI,gBAAiB,EAAA;AAAG,MAAO,OAAA,IAAA,CAAA;AAE/B,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EACA,KAAK,OAAO,OAAA,KAAY,CAAC,GAAG,SAAS,OAAO,CAAA;AAAA,EAC5C,MAAA,EAAQ,OAAO,OAAY,KAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AAClE;;;;"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,9 @@
'use strict';
var Extensions = require('../../extensions/Extensions.js');
var detectBasis = require('./detectBasis.js');
var loadBasis = require('./loadBasis.js');
"use strict";
Extensions.extensions.add(loadBasis.loadBasis, detectBasis.detectBasis);
//# sourceMappingURL=init.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"init.js","sources":["../../../src/compressed-textures/basis/init.ts"],"sourcesContent":["import { extensions } from '../../extensions/Extensions';\nimport { detectBasis } from './detectBasis';\nimport { loadBasis } from './loadBasis';\n\nextensions.add(loadBasis, detectBasis);\n\n"],"names":["extensions","loadBasis","detectBasis"],"mappings":";;;;;;;AAIAA,qBAAW,CAAA,GAAA,CAAIC,qBAAWC,uBAAW,CAAA;;"}

View File

@@ -0,0 +1,7 @@
import { extensions } from '../../extensions/Extensions.mjs';
import { detectBasis } from './detectBasis.mjs';
import { loadBasis } from './loadBasis.mjs';
"use strict";
extensions.add(loadBasis, detectBasis);
//# sourceMappingURL=init.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"init.mjs","sources":["../../../src/compressed-textures/basis/init.ts"],"sourcesContent":["import { extensions } from '../../extensions/Extensions';\nimport { detectBasis } from './detectBasis';\nimport { loadBasis } from './loadBasis';\n\nextensions.add(loadBasis, detectBasis);\n\n"],"names":[],"mappings":";;;;;AAIA,UAAW,CAAA,GAAA,CAAI,WAAW,WAAW,CAAA"}

View File

@@ -0,0 +1,17 @@
import { LoaderParserPriority } from '../../assets/loader/parsers/LoaderParser';
import { ExtensionType } from '../../extensions/Extensions';
import type { Loader } from '../../assets/loader/Loader';
import type { ResolvedAsset } from '../../assets/types';
import type { Texture } from '../../rendering/renderers/shared/texture/Texture';
/** Loads KTX textures! */
export declare const loadBasis: {
extension: {
type: ExtensionType.LoadParser;
priority: LoaderParserPriority;
name: string;
};
name: string;
test(url: string): boolean;
load<T>(url: string, _asset: ResolvedAsset, loader: Loader): Promise<Texture | Texture[]>;
unload(texture: Texture | Texture[]): void;
};

View File

@@ -0,0 +1,38 @@
'use strict';
var LoaderParser = require('../../assets/loader/parsers/LoaderParser.js');
var createTexture = require('../../assets/loader/parsers/textures/utils/createTexture.js');
var checkExtension = require('../../assets/utils/checkExtension.js');
var Extensions = require('../../extensions/Extensions.js');
var CompressedSource = require('../../rendering/renderers/shared/texture/sources/CompressedSource.js');
var getSupportedTextureFormats = require('../../rendering/renderers/shared/texture/utils/getSupportedTextureFormats.js');
var loadBasisOnWorker = require('./worker/loadBasisOnWorker.js');
"use strict";
const loadBasis = {
extension: {
type: Extensions.ExtensionType.LoadParser,
priority: LoaderParser.LoaderParserPriority.High,
name: "loadBasis"
},
name: "loadBasis",
test(url) {
return checkExtension.checkExtension(url, [".basis"]);
},
async load(url, _asset, loader) {
const supportedTextures = await getSupportedTextureFormats.getSupportedTextureFormats();
const textureOptions = await loadBasisOnWorker.loadBasisOnWorker(url, supportedTextures);
const compressedTextureSource = new CompressedSource.CompressedSource(textureOptions);
return createTexture.createTexture(compressedTextureSource, loader, url);
},
unload(texture) {
if (Array.isArray(texture)) {
texture.forEach((t) => t.destroy(true));
} else {
texture.destroy(true);
}
}
};
exports.loadBasis = loadBasis;
//# sourceMappingURL=loadBasis.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"loadBasis.js","sources":["../../../src/compressed-textures/basis/loadBasis.ts"],"sourcesContent":["import { LoaderParserPriority } from '../../assets/loader/parsers/LoaderParser';\nimport { createTexture } from '../../assets/loader/parsers/textures/utils/createTexture';\nimport { checkExtension } from '../../assets/utils/checkExtension';\nimport { ExtensionType } from '../../extensions/Extensions';\nimport { CompressedSource } from '../../rendering/renderers/shared/texture/sources/CompressedSource';\nimport { getSupportedTextureFormats } from '../../rendering/renderers/shared/texture/utils/getSupportedTextureFormats';\nimport { loadBasisOnWorker } from './worker/loadBasisOnWorker';\n\nimport type { Loader } from '../../assets/loader/Loader';\nimport type { LoaderParser } from '../../assets/loader/parsers/LoaderParser';\nimport type { ResolvedAsset } from '../../assets/types';\nimport type { TextureSourceOptions } from '../../rendering/renderers/shared/texture/sources/TextureSource';\nimport type { Texture } from '../../rendering/renderers/shared/texture/Texture';\n\n/** Loads KTX textures! */\nexport const loadBasis = {\n extension: {\n type: ExtensionType.LoadParser,\n priority: LoaderParserPriority.High,\n name: 'loadBasis',\n },\n\n name: 'loadBasis',\n\n test(url: string): boolean\n {\n return checkExtension(url, ['.basis']);\n },\n\n async load(url: string, _asset: ResolvedAsset, loader: Loader): Promise<Texture | Texture[]>\n {\n const supportedTextures = await getSupportedTextureFormats();\n\n const textureOptions = await loadBasisOnWorker(url, supportedTextures);\n\n const compressedTextureSource = new CompressedSource(textureOptions);\n\n return createTexture(compressedTextureSource, loader, url);\n },\n\n unload(texture: Texture | Texture[]): void\n {\n if (Array.isArray(texture))\n {\n texture.forEach((t) => t.destroy(true));\n }\n else\n {\n texture.destroy(true);\n }\n }\n\n} satisfies LoaderParser<Texture | Texture[], TextureSourceOptions>;\n"],"names":["ExtensionType","LoaderParserPriority","checkExtension","getSupportedTextureFormats","loadBasisOnWorker","CompressedSource","createTexture"],"mappings":";;;;;;;;;;;AAeO,MAAM,SAAY,GAAA;AAAA,EACrB,SAAW,EAAA;AAAA,IACP,MAAMA,wBAAc,CAAA,UAAA;AAAA,IACpB,UAAUC,iCAAqB,CAAA,IAAA;AAAA,IAC/B,IAAM,EAAA,WAAA;AAAA,GACV;AAAA,EAEA,IAAM,EAAA,WAAA;AAAA,EAEN,KAAK,GACL,EAAA;AACI,IAAA,OAAOC,6BAAe,CAAA,GAAA,EAAK,CAAC,QAAQ,CAAC,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,MAAM,IAAA,CAAK,GAAa,EAAA,MAAA,EAAuB,MAC/C,EAAA;AACI,IAAM,MAAA,iBAAA,GAAoB,MAAMC,qDAA2B,EAAA,CAAA;AAE3D,IAAA,MAAM,cAAiB,GAAA,MAAMC,mCAAkB,CAAA,GAAA,EAAK,iBAAiB,CAAA,CAAA;AAErE,IAAM,MAAA,uBAAA,GAA0B,IAAIC,iCAAA,CAAiB,cAAc,CAAA,CAAA;AAEnE,IAAO,OAAAC,2BAAA,CAAc,uBAAyB,EAAA,MAAA,EAAQ,GAAG,CAAA,CAAA;AAAA,GAC7D;AAAA,EAEA,OAAO,OACP,EAAA;AACI,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,CACzB,EAAA;AACI,MAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,CAAE,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,KAG1C,MAAA;AACI,MAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,KACxB;AAAA,GACJ;AAEJ;;;;"}

View File

@@ -0,0 +1,36 @@
import { LoaderParserPriority } from '../../assets/loader/parsers/LoaderParser.mjs';
import { createTexture } from '../../assets/loader/parsers/textures/utils/createTexture.mjs';
import { checkExtension } from '../../assets/utils/checkExtension.mjs';
import { ExtensionType } from '../../extensions/Extensions.mjs';
import { CompressedSource } from '../../rendering/renderers/shared/texture/sources/CompressedSource.mjs';
import { getSupportedTextureFormats } from '../../rendering/renderers/shared/texture/utils/getSupportedTextureFormats.mjs';
import { loadBasisOnWorker } from './worker/loadBasisOnWorker.mjs';
"use strict";
const loadBasis = {
extension: {
type: ExtensionType.LoadParser,
priority: LoaderParserPriority.High,
name: "loadBasis"
},
name: "loadBasis",
test(url) {
return checkExtension(url, [".basis"]);
},
async load(url, _asset, loader) {
const supportedTextures = await getSupportedTextureFormats();
const textureOptions = await loadBasisOnWorker(url, supportedTextures);
const compressedTextureSource = new CompressedSource(textureOptions);
return createTexture(compressedTextureSource, loader, url);
},
unload(texture) {
if (Array.isArray(texture)) {
texture.forEach((t) => t.destroy(true));
} else {
texture.destroy(true);
}
}
};
export { loadBasis };
//# sourceMappingURL=loadBasis.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"loadBasis.mjs","sources":["../../../src/compressed-textures/basis/loadBasis.ts"],"sourcesContent":["import { LoaderParserPriority } from '../../assets/loader/parsers/LoaderParser';\nimport { createTexture } from '../../assets/loader/parsers/textures/utils/createTexture';\nimport { checkExtension } from '../../assets/utils/checkExtension';\nimport { ExtensionType } from '../../extensions/Extensions';\nimport { CompressedSource } from '../../rendering/renderers/shared/texture/sources/CompressedSource';\nimport { getSupportedTextureFormats } from '../../rendering/renderers/shared/texture/utils/getSupportedTextureFormats';\nimport { loadBasisOnWorker } from './worker/loadBasisOnWorker';\n\nimport type { Loader } from '../../assets/loader/Loader';\nimport type { LoaderParser } from '../../assets/loader/parsers/LoaderParser';\nimport type { ResolvedAsset } from '../../assets/types';\nimport type { TextureSourceOptions } from '../../rendering/renderers/shared/texture/sources/TextureSource';\nimport type { Texture } from '../../rendering/renderers/shared/texture/Texture';\n\n/** Loads KTX textures! */\nexport const loadBasis = {\n extension: {\n type: ExtensionType.LoadParser,\n priority: LoaderParserPriority.High,\n name: 'loadBasis',\n },\n\n name: 'loadBasis',\n\n test(url: string): boolean\n {\n return checkExtension(url, ['.basis']);\n },\n\n async load(url: string, _asset: ResolvedAsset, loader: Loader): Promise<Texture | Texture[]>\n {\n const supportedTextures = await getSupportedTextureFormats();\n\n const textureOptions = await loadBasisOnWorker(url, supportedTextures);\n\n const compressedTextureSource = new CompressedSource(textureOptions);\n\n return createTexture(compressedTextureSource, loader, url);\n },\n\n unload(texture: Texture | Texture[]): void\n {\n if (Array.isArray(texture))\n {\n texture.forEach((t) => t.destroy(true));\n }\n else\n {\n texture.destroy(true);\n }\n }\n\n} satisfies LoaderParser<Texture | Texture[], TextureSourceOptions>;\n"],"names":[],"mappings":";;;;;;;;;AAeO,MAAM,SAAY,GAAA;AAAA,EACrB,SAAW,EAAA;AAAA,IACP,MAAM,aAAc,CAAA,UAAA;AAAA,IACpB,UAAU,oBAAqB,CAAA,IAAA;AAAA,IAC/B,IAAM,EAAA,WAAA;AAAA,GACV;AAAA,EAEA,IAAM,EAAA,WAAA;AAAA,EAEN,KAAK,GACL,EAAA;AACI,IAAA,OAAO,cAAe,CAAA,GAAA,EAAK,CAAC,QAAQ,CAAC,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,MAAM,IAAA,CAAK,GAAa,EAAA,MAAA,EAAuB,MAC/C,EAAA;AACI,IAAM,MAAA,iBAAA,GAAoB,MAAM,0BAA2B,EAAA,CAAA;AAE3D,IAAA,MAAM,cAAiB,GAAA,MAAM,iBAAkB,CAAA,GAAA,EAAK,iBAAiB,CAAA,CAAA;AAErE,IAAM,MAAA,uBAAA,GAA0B,IAAI,gBAAA,CAAiB,cAAc,CAAA,CAAA;AAEnE,IAAO,OAAA,aAAA,CAAc,uBAAyB,EAAA,MAAA,EAAQ,GAAG,CAAA,CAAA;AAAA,GAC7D;AAAA,EAEA,OAAO,OACP,EAAA;AACI,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,CACzB,EAAA;AACI,MAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,CAAE,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,KAG1C,MAAA;AACI,MAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,KACxB;AAAA,GACJ;AAEJ;;;;"}

View File

@@ -0,0 +1,19 @@
export type BASISModuleCreator = (config: {
locateFile: (file: string) => string;
}) => {
then: (result: (libktx: BASISModule) => void) => void;
};
export type BasisTextureConstructor = new (data: Uint8Array) => BasisTexture;
export interface BASISModule {
initializeBasis(): void;
BasisFile: BasisTextureConstructor;
}
export interface BasisTexture {
getNumImages(): number;
getNumLevels(imageIndex: number): number;
startTranscoding(): boolean;
getImageWidth(imageIndex: number, levelIndex: number): number;
getImageHeight(imageIndex: number, levelIndex: number): number;
getImageTranscodedSizeInBytes(imageIndex: number, levelIndex: number, format: number): number;
transcodeImage(buffer: Uint8Array, imageIndex: number, levelIndex: number, format: number, unused: number, getAlphaForOpaqueFormats: number): boolean;
}

View File

@@ -0,0 +1,4 @@
'use strict';
"use strict";
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}

View File

@@ -0,0 +1,2 @@
"use strict";
//# sourceMappingURL=types.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}

View File

@@ -0,0 +1,2 @@
import type { BasisTexture } from '../types';
export declare function createLevelBuffers(basisTexture: BasisTexture, basisTranscoderFormat: number): Uint8Array[];

View File

@@ -0,0 +1,27 @@
'use strict';
"use strict";
function createLevelBuffers(basisTexture, basisTranscoderFormat) {
const images = basisTexture.getNumImages();
const levels = basisTexture.getNumLevels(0);
const success = basisTexture.startTranscoding();
if (!success) {
throw new Error("startTranscoding failed");
}
const levelBuffers = [];
for (let levelIndex = 0; levelIndex < levels; ++levelIndex) {
for (let sliceIndex = 0; sliceIndex < images; ++sliceIndex) {
const transcodeSize = basisTexture.getImageTranscodedSizeInBytes(sliceIndex, levelIndex, basisTranscoderFormat);
const levelBuffer = new Uint8Array(transcodeSize);
const success2 = basisTexture.transcodeImage(levelBuffer, sliceIndex, levelIndex, basisTranscoderFormat, 1, 0);
if (!success2) {
throw new Error("transcodeImage failed");
}
levelBuffers.push(levelBuffer);
}
}
return levelBuffers;
}
exports.createLevelBuffers = createLevelBuffers;
//# sourceMappingURL=createLevelBuffers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"createLevelBuffers.js","sources":["../../../../src/compressed-textures/basis/utils/createLevelBuffers.ts"],"sourcesContent":["import type { BasisTexture } from '../types';\n\nexport function createLevelBuffers(basisTexture: BasisTexture, basisTranscoderFormat: number): Uint8Array[]\n{\n const images = basisTexture.getNumImages();\n const levels = basisTexture.getNumLevels(0);\n\n const success = basisTexture.startTranscoding();\n\n if (!success)\n {\n throw new Error('startTranscoding failed');\n }\n\n const levelBuffers = [];\n\n for (let levelIndex = 0; levelIndex < levels; ++levelIndex)\n {\n for (let sliceIndex = 0; sliceIndex < images; ++sliceIndex)\n {\n const transcodeSize = basisTexture.getImageTranscodedSizeInBytes(sliceIndex, levelIndex, basisTranscoderFormat);\n const levelBuffer = new Uint8Array(transcodeSize);\n\n const success = basisTexture.transcodeImage(levelBuffer, sliceIndex, levelIndex, basisTranscoderFormat, 1, 0);\n\n if (!success)\n {\n throw new Error('transcodeImage failed');\n }\n\n levelBuffers.push(levelBuffer);\n }\n }\n\n return levelBuffers;\n}\n"],"names":["success"],"mappings":";;;AAEgB,SAAA,kBAAA,CAAmB,cAA4B,qBAC/D,EAAA;AACI,EAAM,MAAA,MAAA,GAAS,aAAa,YAAa,EAAA,CAAA;AACzC,EAAM,MAAA,MAAA,GAAS,YAAa,CAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAE1C,EAAM,MAAA,OAAA,GAAU,aAAa,gBAAiB,EAAA,CAAA;AAE9C,EAAA,IAAI,CAAC,OACL,EAAA;AACI,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,GAC7C;AAEA,EAAA,MAAM,eAAe,EAAC,CAAA;AAEtB,EAAA,KAAA,IAAS,UAAa,GAAA,CAAA,EAAG,UAAa,GAAA,MAAA,EAAQ,EAAE,UAChD,EAAA;AACI,IAAA,KAAA,IAAS,UAAa,GAAA,CAAA,EAAG,UAAa,GAAA,MAAA,EAAQ,EAAE,UAChD,EAAA;AACI,MAAA,MAAM,aAAgB,GAAA,YAAA,CAAa,6BAA8B,CAAA,UAAA,EAAY,YAAY,qBAAqB,CAAA,CAAA;AAC9G,MAAM,MAAA,WAAA,GAAc,IAAI,UAAA,CAAW,aAAa,CAAA,CAAA;AAEhD,MAAMA,MAAAA,QAAAA,GAAU,aAAa,cAAe,CAAA,WAAA,EAAa,YAAY,UAAY,EAAA,qBAAA,EAAuB,GAAG,CAAC,CAAA,CAAA;AAE5G,MAAA,IAAI,CAACA,QACL,EAAA;AACI,QAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,OAC3C;AAEA,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA,CAAA;AAAA,KACjC;AAAA,GACJ;AAEA,EAAO,OAAA,YAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,25 @@
"use strict";
function createLevelBuffers(basisTexture, basisTranscoderFormat) {
const images = basisTexture.getNumImages();
const levels = basisTexture.getNumLevels(0);
const success = basisTexture.startTranscoding();
if (!success) {
throw new Error("startTranscoding failed");
}
const levelBuffers = [];
for (let levelIndex = 0; levelIndex < levels; ++levelIndex) {
for (let sliceIndex = 0; sliceIndex < images; ++sliceIndex) {
const transcodeSize = basisTexture.getImageTranscodedSizeInBytes(sliceIndex, levelIndex, basisTranscoderFormat);
const levelBuffer = new Uint8Array(transcodeSize);
const success2 = basisTexture.transcodeImage(levelBuffer, sliceIndex, levelIndex, basisTranscoderFormat, 1, 0);
if (!success2) {
throw new Error("transcodeImage failed");
}
levelBuffers.push(levelBuffer);
}
}
return levelBuffers;
}
export { createLevelBuffers };
//# sourceMappingURL=createLevelBuffers.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"createLevelBuffers.mjs","sources":["../../../../src/compressed-textures/basis/utils/createLevelBuffers.ts"],"sourcesContent":["import type { BasisTexture } from '../types';\n\nexport function createLevelBuffers(basisTexture: BasisTexture, basisTranscoderFormat: number): Uint8Array[]\n{\n const images = basisTexture.getNumImages();\n const levels = basisTexture.getNumLevels(0);\n\n const success = basisTexture.startTranscoding();\n\n if (!success)\n {\n throw new Error('startTranscoding failed');\n }\n\n const levelBuffers = [];\n\n for (let levelIndex = 0; levelIndex < levels; ++levelIndex)\n {\n for (let sliceIndex = 0; sliceIndex < images; ++sliceIndex)\n {\n const transcodeSize = basisTexture.getImageTranscodedSizeInBytes(sliceIndex, levelIndex, basisTranscoderFormat);\n const levelBuffer = new Uint8Array(transcodeSize);\n\n const success = basisTexture.transcodeImage(levelBuffer, sliceIndex, levelIndex, basisTranscoderFormat, 1, 0);\n\n if (!success)\n {\n throw new Error('transcodeImage failed');\n }\n\n levelBuffers.push(levelBuffer);\n }\n }\n\n return levelBuffers;\n}\n"],"names":["success"],"mappings":";AAEgB,SAAA,kBAAA,CAAmB,cAA4B,qBAC/D,EAAA;AACI,EAAM,MAAA,MAAA,GAAS,aAAa,YAAa,EAAA,CAAA;AACzC,EAAM,MAAA,MAAA,GAAS,YAAa,CAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAE1C,EAAM,MAAA,OAAA,GAAU,aAAa,gBAAiB,EAAA,CAAA;AAE9C,EAAA,IAAI,CAAC,OACL,EAAA;AACI,IAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,GAC7C;AAEA,EAAA,MAAM,eAAe,EAAC,CAAA;AAEtB,EAAA,KAAA,IAAS,UAAa,GAAA,CAAA,EAAG,UAAa,GAAA,MAAA,EAAQ,EAAE,UAChD,EAAA;AACI,IAAA,KAAA,IAAS,UAAa,GAAA,CAAA,EAAG,UAAa,GAAA,MAAA,EAAQ,EAAE,UAChD,EAAA;AACI,MAAA,MAAM,aAAgB,GAAA,YAAA,CAAa,6BAA8B,CAAA,UAAA,EAAY,YAAY,qBAAqB,CAAA,CAAA;AAC9G,MAAM,MAAA,WAAA,GAAc,IAAI,UAAA,CAAW,aAAa,CAAA,CAAA;AAEhD,MAAMA,MAAAA,QAAAA,GAAU,aAAa,cAAe,CAAA,WAAA,EAAa,YAAY,UAAY,EAAA,qBAAA,EAAuB,GAAG,CAAC,CAAA,CAAA;AAE5G,MAAA,IAAI,CAACA,QACL,EAAA;AACI,QAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,OAC3C;AAEA,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA,CAAA;AAAA,KACjC;AAAA,GACJ;AAEA,EAAO,OAAA,YAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1 @@
export declare function gpuFormatToBasisTranscoderFormat(transcoderFormat: string): number;

View File

@@ -0,0 +1,28 @@
'use strict';
"use strict";
const gpuFormatToBasisTranscoderFormatMap = {
"bc3-rgba-unorm": 3,
// cTFBC3_RGBA
"bc7-rgba-unorm": 6,
// cTFBC7_RGBA,
"etc2-rgba8unorm": 1,
// cTFETC2_RGBA,
"astc-4x4-unorm": 10,
// cTFASTC_4x4_RGBA,
// Uncompressed
rgba8unorm: 13,
// cTFRGBA32,
rgba4unorm: 16
// cTFRGBA4444,
};
function gpuFormatToBasisTranscoderFormat(transcoderFormat) {
const format = gpuFormatToBasisTranscoderFormatMap[transcoderFormat];
if (format) {
return format;
}
throw new Error(`Unsupported transcoderFormat: ${transcoderFormat}`);
}
exports.gpuFormatToBasisTranscoderFormat = gpuFormatToBasisTranscoderFormat;
//# sourceMappingURL=gpuFormatToBasisTranscoderFormat.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"gpuFormatToBasisTranscoderFormat.js","sources":["../../../../src/compressed-textures/basis/utils/gpuFormatToBasisTranscoderFormat.ts"],"sourcesContent":["const gpuFormatToBasisTranscoderFormatMap: Record<string, number> = {\n 'bc3-rgba-unorm': 3, // cTFBC3_RGBA\n 'bc7-rgba-unorm': 6, // cTFBC7_RGBA,\n 'etc2-rgba8unorm': 1, // cTFETC2_RGBA,\n 'astc-4x4-unorm': 10, // cTFASTC_4x4_RGBA,\n // Uncompressed\n rgba8unorm: 13, // cTFRGBA32,\n rgba4unorm: 16, // cTFRGBA4444,\n};\n\nexport function gpuFormatToBasisTranscoderFormat(transcoderFormat: string): number\n{\n const format = gpuFormatToBasisTranscoderFormatMap[transcoderFormat];\n\n if (format)\n {\n return format;\n }\n\n throw new Error(`Unsupported transcoderFormat: ${transcoderFormat}`);\n}\n"],"names":[],"mappings":";;;AAAA,MAAM,mCAA8D,GAAA;AAAA,EAChE,gBAAkB,EAAA,CAAA;AAAA;AAAA,EAClB,gBAAkB,EAAA,CAAA;AAAA;AAAA,EAClB,iBAAmB,EAAA,CAAA;AAAA;AAAA,EACnB,gBAAkB,EAAA,EAAA;AAAA;AAAA;AAAA,EAElB,UAAY,EAAA,EAAA;AAAA;AAAA,EACZ,UAAY,EAAA,EAAA;AAAA;AAChB,CAAA,CAAA;AAEO,SAAS,iCAAiC,gBACjD,EAAA;AACI,EAAM,MAAA,MAAA,GAAS,oCAAoC,gBAAgB,CAAA,CAAA;AAEnE,EAAA,IAAI,MACJ,EAAA;AACI,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAiC,8BAAA,EAAA,gBAAgB,CAAE,CAAA,CAAA,CAAA;AACvE;;;;"}

View File

@@ -0,0 +1,26 @@
"use strict";
const gpuFormatToBasisTranscoderFormatMap = {
"bc3-rgba-unorm": 3,
// cTFBC3_RGBA
"bc7-rgba-unorm": 6,
// cTFBC7_RGBA,
"etc2-rgba8unorm": 1,
// cTFETC2_RGBA,
"astc-4x4-unorm": 10,
// cTFASTC_4x4_RGBA,
// Uncompressed
rgba8unorm: 13,
// cTFRGBA32,
rgba4unorm: 16
// cTFRGBA4444,
};
function gpuFormatToBasisTranscoderFormat(transcoderFormat) {
const format = gpuFormatToBasisTranscoderFormatMap[transcoderFormat];
if (format) {
return format;
}
throw new Error(`Unsupported transcoderFormat: ${transcoderFormat}`);
}
export { gpuFormatToBasisTranscoderFormat };
//# sourceMappingURL=gpuFormatToBasisTranscoderFormat.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"gpuFormatToBasisTranscoderFormat.mjs","sources":["../../../../src/compressed-textures/basis/utils/gpuFormatToBasisTranscoderFormat.ts"],"sourcesContent":["const gpuFormatToBasisTranscoderFormatMap: Record<string, number> = {\n 'bc3-rgba-unorm': 3, // cTFBC3_RGBA\n 'bc7-rgba-unorm': 6, // cTFBC7_RGBA,\n 'etc2-rgba8unorm': 1, // cTFETC2_RGBA,\n 'astc-4x4-unorm': 10, // cTFASTC_4x4_RGBA,\n // Uncompressed\n rgba8unorm: 13, // cTFRGBA32,\n rgba4unorm: 16, // cTFRGBA4444,\n};\n\nexport function gpuFormatToBasisTranscoderFormat(transcoderFormat: string): number\n{\n const format = gpuFormatToBasisTranscoderFormatMap[transcoderFormat];\n\n if (format)\n {\n return format;\n }\n\n throw new Error(`Unsupported transcoderFormat: ${transcoderFormat}`);\n}\n"],"names":[],"mappings":";AAAA,MAAM,mCAA8D,GAAA;AAAA,EAChE,gBAAkB,EAAA,CAAA;AAAA;AAAA,EAClB,gBAAkB,EAAA,CAAA;AAAA;AAAA,EAClB,iBAAmB,EAAA,CAAA;AAAA;AAAA,EACnB,gBAAkB,EAAA,EAAA;AAAA;AAAA;AAAA,EAElB,UAAY,EAAA,EAAA;AAAA;AAAA,EACZ,UAAY,EAAA,EAAA;AAAA;AAChB,CAAA,CAAA;AAEO,SAAS,iCAAiC,gBACjD,EAAA;AACI,EAAM,MAAA,MAAA,GAAS,oCAAoC,gBAAgB,CAAA,CAAA;AAEnE,EAAA,IAAI,MACJ,EAAA;AACI,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAiC,8BAAA,EAAA,gBAAgB,CAAE,CAAA,CAAA,CAAA;AACvE;;;;"}

View File

@@ -0,0 +1,5 @@
export declare const basisTranscoderUrls: {
jsUrl: string;
wasmUrl: string;
};
export declare function setBasisTranscoderPath(config: Partial<typeof basisTranscoderUrls>): void;

View File

@@ -0,0 +1,14 @@
'use strict';
"use strict";
const basisTranscoderUrls = {
jsUrl: "https://files.pixijs.download/transcoders/basis/basis_transcoder.js",
wasmUrl: "https://files.pixijs.download/transcoders/basis/basis_transcoder.wasm"
};
function setBasisTranscoderPath(config) {
Object.assign(basisTranscoderUrls, config);
}
exports.basisTranscoderUrls = basisTranscoderUrls;
exports.setBasisTranscoderPath = setBasisTranscoderPath;
//# sourceMappingURL=setBasisTranscoderPath.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"setBasisTranscoderPath.js","sources":["../../../../src/compressed-textures/basis/utils/setBasisTranscoderPath.ts"],"sourcesContent":["export const basisTranscoderUrls = {\n jsUrl: 'https://files.pixijs.download/transcoders/basis/basis_transcoder.js',\n wasmUrl: 'https://files.pixijs.download/transcoders/basis/basis_transcoder.wasm',\n};\n\nexport function setBasisTranscoderPath(config: Partial<typeof basisTranscoderUrls>)\n{\n Object.assign(basisTranscoderUrls, config);\n}\n"],"names":[],"mappings":";;;AAAO,MAAM,mBAAsB,GAAA;AAAA,EAC/B,KAAO,EAAA,qEAAA;AAAA,EACP,OAAS,EAAA,uEAAA;AACb,EAAA;AAEO,SAAS,uBAAuB,MACvC,EAAA;AACI,EAAO,MAAA,CAAA,MAAA,CAAO,qBAAqB,MAAM,CAAA,CAAA;AAC7C;;;;;"}

View File

@@ -0,0 +1,11 @@
"use strict";
const basisTranscoderUrls = {
jsUrl: "https://files.pixijs.download/transcoders/basis/basis_transcoder.js",
wasmUrl: "https://files.pixijs.download/transcoders/basis/basis_transcoder.wasm"
};
function setBasisTranscoderPath(config) {
Object.assign(basisTranscoderUrls, config);
}
export { basisTranscoderUrls, setBasisTranscoderPath };
//# sourceMappingURL=setBasisTranscoderPath.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"setBasisTranscoderPath.mjs","sources":["../../../../src/compressed-textures/basis/utils/setBasisTranscoderPath.ts"],"sourcesContent":["export const basisTranscoderUrls = {\n jsUrl: 'https://files.pixijs.download/transcoders/basis/basis_transcoder.js',\n wasmUrl: 'https://files.pixijs.download/transcoders/basis/basis_transcoder.wasm',\n};\n\nexport function setBasisTranscoderPath(config: Partial<typeof basisTranscoderUrls>)\n{\n Object.assign(basisTranscoderUrls, config);\n}\n"],"names":[],"mappings":";AAAO,MAAM,mBAAsB,GAAA;AAAA,EAC/B,KAAO,EAAA,qEAAA;AAAA,EACP,OAAS,EAAA,uEAAA;AACb,EAAA;AAEO,SAAS,uBAAuB,MACvC,EAAA;AACI,EAAO,MAAA,CAAA,MAAA,CAAO,qBAAqB,MAAM,CAAA,CAAA;AAC7C;;;;"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,3 @@
import type { TEXTURE_FORMATS } from '../../../rendering/renderers/shared/texture/const';
import type { TextureSourceOptions } from '../../../rendering/renderers/shared/texture/sources/TextureSource';
export declare function loadBasisOnWorker(url: string, supportedTextures: TEXTURE_FORMATS[]): Promise<TextureSourceOptions>;

View File

@@ -0,0 +1,37 @@
'use strict';
var basis_worker = require('../../../_virtual/basis.worker.js');
var setBasisTranscoderPath = require('../utils/setBasisTranscoderPath.js');
"use strict";
let basisWorker;
const urlHash = {};
function getBasisWorker(supportedTextures) {
if (!basisWorker) {
basisWorker = new basis_worker.default().worker;
basisWorker.onmessage = (messageEvent) => {
const { success, url, textureOptions } = messageEvent.data;
if (!success) {
console.warn("Failed to load Basis texture", url);
}
urlHash[url](textureOptions);
};
basisWorker.postMessage({
type: "init",
jsUrl: setBasisTranscoderPath.basisTranscoderUrls.jsUrl,
wasmUrl: setBasisTranscoderPath.basisTranscoderUrls.wasmUrl,
supportedTextures
});
}
return basisWorker;
}
function loadBasisOnWorker(url, supportedTextures) {
const ktxWorker = getBasisWorker(supportedTextures);
return new Promise((resolve) => {
urlHash[url] = resolve;
ktxWorker.postMessage({ type: "load", url });
});
}
exports.loadBasisOnWorker = loadBasisOnWorker;
//# sourceMappingURL=loadBasisOnWorker.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"loadBasisOnWorker.js","sources":["../../../../src/compressed-textures/basis/worker/loadBasisOnWorker.ts"],"sourcesContent":["import BasisWorker from 'worker:./basis.worker.ts';\nimport { basisTranscoderUrls } from '../utils/setBasisTranscoderPath';\n\nimport type { TEXTURE_FORMATS } from '../../../rendering/renderers/shared/texture/const';\nimport type { TextureSourceOptions } from '../../../rendering/renderers/shared/texture/sources/TextureSource';\n\nlet basisWorker: Worker;\nconst urlHash: Record<string, (value: any) => void> = {};\n\nfunction getBasisWorker(supportedTextures: TEXTURE_FORMATS[]): Worker\n{\n if (!basisWorker)\n {\n basisWorker = new BasisWorker().worker;\n\n basisWorker.onmessage = (messageEvent) =>\n {\n const { success, url, textureOptions } = messageEvent.data;\n\n if (!success)\n {\n console.warn('Failed to load Basis texture', url);\n }\n\n urlHash[url](textureOptions);\n };\n\n basisWorker.postMessage({\n type: 'init',\n jsUrl: basisTranscoderUrls.jsUrl,\n wasmUrl: basisTranscoderUrls.wasmUrl,\n supportedTextures\n });\n }\n\n return basisWorker;\n}\n\nexport function loadBasisOnWorker(\n url: string,\n supportedTextures: TEXTURE_FORMATS[]\n): Promise<TextureSourceOptions>\n{\n const ktxWorker = getBasisWorker(supportedTextures);\n\n return new Promise((resolve) =>\n {\n urlHash[url] = resolve;\n\n ktxWorker.postMessage({ type: 'load', url });\n });\n}\n"],"names":["BasisWorker","basisTranscoderUrls"],"mappings":";;;;;;AAMA,IAAI,WAAA,CAAA;AACJ,MAAM,UAAgD,EAAC,CAAA;AAEvD,SAAS,eAAe,iBACxB,EAAA;AACI,EAAA,IAAI,CAAC,WACL,EAAA;AACI,IAAc,WAAA,GAAA,IAAIA,sBAAc,CAAA,MAAA,CAAA;AAEhC,IAAY,WAAA,CAAA,SAAA,GAAY,CAAC,YACzB,KAAA;AACI,MAAA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,cAAA,KAAmB,YAAa,CAAA,IAAA,CAAA;AAEtD,MAAA,IAAI,CAAC,OACL,EAAA;AACI,QAAQ,OAAA,CAAA,IAAA,CAAK,gCAAgC,GAAG,CAAA,CAAA;AAAA,OACpD;AAEA,MAAQ,OAAA,CAAA,GAAG,EAAE,cAAc,CAAA,CAAA;AAAA,KAC/B,CAAA;AAEA,IAAA,WAAA,CAAY,WAAY,CAAA;AAAA,MACpB,IAAM,EAAA,MAAA;AAAA,MACN,OAAOC,0CAAoB,CAAA,KAAA;AAAA,MAC3B,SAASA,0CAAoB,CAAA,OAAA;AAAA,MAC7B,iBAAA;AAAA,KACH,CAAA,CAAA;AAAA,GACL;AAEA,EAAO,OAAA,WAAA,CAAA;AACX,CAAA;AAEgB,SAAA,iBAAA,CACZ,KACA,iBAEJ,EAAA;AACI,EAAM,MAAA,SAAA,GAAY,eAAe,iBAAiB,CAAA,CAAA;AAElD,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OACpB,KAAA;AACI,IAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,OAAA,CAAA;AAEf,IAAA,SAAA,CAAU,WAAY,CAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,GAC9C,CAAA,CAAA;AACL;;;;"}

View File

@@ -0,0 +1,35 @@
import WorkerInstance from '../../../_virtual/basis.worker.mjs';
import { basisTranscoderUrls } from '../utils/setBasisTranscoderPath.mjs';
"use strict";
let basisWorker;
const urlHash = {};
function getBasisWorker(supportedTextures) {
if (!basisWorker) {
basisWorker = new WorkerInstance().worker;
basisWorker.onmessage = (messageEvent) => {
const { success, url, textureOptions } = messageEvent.data;
if (!success) {
console.warn("Failed to load Basis texture", url);
}
urlHash[url](textureOptions);
};
basisWorker.postMessage({
type: "init",
jsUrl: basisTranscoderUrls.jsUrl,
wasmUrl: basisTranscoderUrls.wasmUrl,
supportedTextures
});
}
return basisWorker;
}
function loadBasisOnWorker(url, supportedTextures) {
const ktxWorker = getBasisWorker(supportedTextures);
return new Promise((resolve) => {
urlHash[url] = resolve;
ktxWorker.postMessage({ type: "load", url });
});
}
export { loadBasisOnWorker };
//# sourceMappingURL=loadBasisOnWorker.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"loadBasisOnWorker.mjs","sources":["../../../../src/compressed-textures/basis/worker/loadBasisOnWorker.ts"],"sourcesContent":["import BasisWorker from 'worker:./basis.worker.ts';\nimport { basisTranscoderUrls } from '../utils/setBasisTranscoderPath';\n\nimport type { TEXTURE_FORMATS } from '../../../rendering/renderers/shared/texture/const';\nimport type { TextureSourceOptions } from '../../../rendering/renderers/shared/texture/sources/TextureSource';\n\nlet basisWorker: Worker;\nconst urlHash: Record<string, (value: any) => void> = {};\n\nfunction getBasisWorker(supportedTextures: TEXTURE_FORMATS[]): Worker\n{\n if (!basisWorker)\n {\n basisWorker = new BasisWorker().worker;\n\n basisWorker.onmessage = (messageEvent) =>\n {\n const { success, url, textureOptions } = messageEvent.data;\n\n if (!success)\n {\n console.warn('Failed to load Basis texture', url);\n }\n\n urlHash[url](textureOptions);\n };\n\n basisWorker.postMessage({\n type: 'init',\n jsUrl: basisTranscoderUrls.jsUrl,\n wasmUrl: basisTranscoderUrls.wasmUrl,\n supportedTextures\n });\n }\n\n return basisWorker;\n}\n\nexport function loadBasisOnWorker(\n url: string,\n supportedTextures: TEXTURE_FORMATS[]\n): Promise<TextureSourceOptions>\n{\n const ktxWorker = getBasisWorker(supportedTextures);\n\n return new Promise((resolve) =>\n {\n urlHash[url] = resolve;\n\n ktxWorker.postMessage({ type: 'load', url });\n });\n}\n"],"names":["BasisWorker"],"mappings":";;;;AAMA,IAAI,WAAA,CAAA;AACJ,MAAM,UAAgD,EAAC,CAAA;AAEvD,SAAS,eAAe,iBACxB,EAAA;AACI,EAAA,IAAI,CAAC,WACL,EAAA;AACI,IAAc,WAAA,GAAA,IAAIA,gBAAc,CAAA,MAAA,CAAA;AAEhC,IAAY,WAAA,CAAA,SAAA,GAAY,CAAC,YACzB,KAAA;AACI,MAAA,MAAM,EAAE,OAAA,EAAS,GAAK,EAAA,cAAA,KAAmB,YAAa,CAAA,IAAA,CAAA;AAEtD,MAAA,IAAI,CAAC,OACL,EAAA;AACI,QAAQ,OAAA,CAAA,IAAA,CAAK,gCAAgC,GAAG,CAAA,CAAA;AAAA,OACpD;AAEA,MAAQ,OAAA,CAAA,GAAG,EAAE,cAAc,CAAA,CAAA;AAAA,KAC/B,CAAA;AAEA,IAAA,WAAA,CAAY,WAAY,CAAA;AAAA,MACpB,IAAM,EAAA,MAAA;AAAA,MACN,OAAO,mBAAoB,CAAA,KAAA;AAAA,MAC3B,SAAS,mBAAoB,CAAA,OAAA;AAAA,MAC7B,iBAAA;AAAA,KACH,CAAA,CAAA;AAAA,GACL;AAEA,EAAO,OAAA,WAAA,CAAA;AACX,CAAA;AAEgB,SAAA,iBAAA,CACZ,KACA,iBAEJ,EAAA;AACI,EAAM,MAAA,SAAA,GAAY,eAAe,iBAAiB,CAAA,CAAA;AAElD,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OACpB,KAAA;AACI,IAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,OAAA,CAAA;AAEf,IAAA,SAAA,CAAU,WAAY,CAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,GAC9C,CAAA,CAAA;AACL;;;;"}