1 line
9.1 KiB
Plaintext
1 line
9.1 KiB
Plaintext
|
|
{"version":3,"file":"spritesheetAsset.mjs","sources":["../src/spritesheetAsset.ts"],"sourcesContent":["import { copySearchParams, LoaderParserPriority } from '@pixi/assets';\nimport { extensions, ExtensionType, settings, utils } from '@pixi/core';\nimport { Spritesheet } from './Spritesheet';\n\nimport type { AssetExtension, Loader, ResolvedAsset, UnresolvedAsset } from '@pixi/assets';\nimport type { Texture } from '@pixi/core';\nimport type { ISpritesheetData } from './Spritesheet';\n\nexport interface SpriteSheetJson extends ISpritesheetData\n{\n meta: {\n image: string;\n scale: string;\n // eslint-disable-next-line camelcase\n related_multi_packs?: string[];\n };\n}\n\nconst validImages = ['jpg', 'png', 'jpeg', 'avif', 'webp',\n 's3tc', 's3tc_sRGB', 'etc', 'etc1', 'pvrtc', 'atc', 'astc', 'bptc'];\n\nfunction getCacheableAssets(keys: string[], asset: Spritesheet, ignoreMultiPack: boolean)\n{\n const out: Record<string, Texture | Spritesheet> = {};\n\n keys.forEach((key: string) =>\n {\n out[key] = asset;\n });\n\n Object.keys(asset.textures).forEach((key) =>\n {\n out[`${asset.cachePrefix}${key}`] = asset.textures[key];\n });\n\n if (!ignoreMultiPack)\n {\n const basePath = utils.path.dirname(keys[0]);\n\n asset.linkedSheets.forEach((item: Spritesheet, i) =>\n {\n Object.assign(out, getCacheableAssets(\n [`${basePath}/${asset.data.meta.related_multi_packs[i]}`],\n item,\n true\n ));\n });\n }\n\n return out;\n}\n\n/**\n * Asset extension for loading spritesheets.\n * @memberof PIXI\n * @type {PIXI.AssetExtension}\n */\nexport const spritesheetAsset = {\n extension: ExtensionType.Asset,\n /** Handle the caching of the related Spritesheet Textures */\n cache: {\n test: (asset: Spritesheet) => asset instanceof Spritesheet,\n getCacheableAssets: (keys: string[], asset: Spritesheet) => getCacheableAssets(keys, asset, false),\n },\n /** Resolve the the resolution of the asset. */\n resolver: {\n test: (value: string): boolean =>\n {\n const tempURL = value.split('?')[0];\n const split = tempURL.split('.');\n const extension = split.pop();\n const format = split.pop();\n\n return extension === 'json' && validImages.includes(format);\n },\n parse: (value: string): UnresolvedAsset =>\n {\n const split = value.split('.');\n\n return {\n resolution: parseFloat(settings.RETINA_PREFIX.exec(value)?.[1] ?? '1'),\n format: split[split.length - 2],\n src: value,\n };\n },\n },\n /**\n * Loader plugin that parses sprite sheets!\n * once the JSON has been loaded this checks to see if the JSON is spritesheet data.\n * If it is, we load the spritesheets image and parse the data into PIXI.Spritesheet\n * All textures in the sprite sheet are then added to the cache\n * @ignore\n */\n loader: {\n name: 'spritesheetLoader',\n\n extension: {\n type: ExtensionType.LoadParser,\n priority: LoaderParserPriority.Normal,\n },\n\n async testParse(asset: SpriteSheetJson, options: ResolvedAsset): Promise<boolean>\n {\n return (utils.path.extname(options.src).toLowerCase() === '.json' && !!asset.frames);\n },\n\n async parse(asset: SpriteSheetJson, options: ResolvedAsset, loader: Loader): Promise<Spritesheet>\n {\n const {\n texture: imageTexture, // if user need to use preloaded texture\n imageFilename, // if user need to use custom filename (not from jsonFile.meta.image)\n cachePrefix, // if user need to use custom cache prefix\n } = options?.data ?? {};\n\n let basePath = utils.path.dirname(options.src);\n\n if (basePath && basePath.lastIndexOf('/') !== (basePath.
|