{"version":3,"file":"spritesheetAsset.mjs","sources":["../../src/spritesheet/spritesheetAsset.ts"],"sourcesContent":["import { LoaderParserPriority } from '../assets/loader/parsers/LoaderParser';\nimport { Resolver } from '../assets/resolver/Resolver';\nimport { copySearchParams } from '../assets/utils/copySearchParams';\nimport { ExtensionType } from '../extensions/Extensions';\nimport { Texture } from '../rendering/renderers/shared/texture/Texture';\nimport { path } from '../utils/path';\nimport { Spritesheet } from './Spritesheet';\n\nimport type { AssetExtensionAdvanced } from '../assets/AssetExtension';\nimport type { Loader } from '../assets/loader/Loader';\nimport type { ResolvedAsset } from '../assets/types';\nimport type { TextureSourceOptions } from '../rendering/renderers/shared/texture/sources/TextureSource';\nimport type { SpritesheetData } from './Spritesheet';\n\n/**\n * Interface for the JSON data structure of a spritesheet.\n * This is used to define the structure of the JSON file that describes a spritesheet.\n * It includes metadata about the spritesheet and the frames it contains.\n * @see {@link Spritesheet}\n * @see {@link SpritesheetData}\n * @category assets\n * @advanced\n */\nexport interface SpriteSheetJson extends SpritesheetData\n{\n    meta: {\n        image: string;\n        scale: string;\n        related_multi_packs?: string[];\n    };\n}\n\nconst validImages = ['jpg', 'png', 'jpeg', 'avif', 'webp',\n    'basis', 'etc2', 'bc7', 'bc6h', 'bc5', 'bc4', 'bc3', 'bc2', 'bc1', 'eac', 'astc'];\n\nfunction getCacheableAssets(keys: string[], asset: Spritesheet, ignoreMultiPack: boolean)\n{\n    const out: Record<string, any> = {};\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 = path.dirname(keys[0]);\n\n        asset.linkedSheets.forEach((item: Spritesheet, i) =>\n        {\n            const out2 = getCacheableAssets([`${basePath}/${asset.data.meta.related_multi_packs[i]}`], item, true);\n\n            Object.assign(out, out2);\n        });\n    }\n\n    return out;\n}\n\n/**\n * Asset extension for loading spritesheets\n * @example\n * import { Assets } from 'pixi.js';\n *\n * Assets.load({\n *     alias: 'spritesheet',\n *     src: 'path/to/spritesheet.json',\n *     data: {\n *         ignoreMultiPack: true,\n *         textureOptions: {\n *             scaleMode: \"nearest\"\n *         }\n *     }\n * })\n * @type {AssetExtension}\n * @category assets\n * @advanced\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 resolution of the asset. */\n    resolver: {\n        extension: {\n            type: ExtensionType.ResolveParser,\n            name: 'resolveSpritesheet',\n        },\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) =>\n        {\n            const split = value.split('.');\n\n            return {\n                resolution: parseFloat(Resolver.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 Spritesheet\n     * All textures in the sprite sheet are then added to the cache\n     */\n    loader: {\n        /** used for deprecation purposes */\n        name: 'spritesheetLoader',\n        id: 'spritesheet',\n\n        extension: {\n            type: ExtensionType.LoadParser,\n            priority: LoaderParserPriority.Normal,\n            name: 'spritesheetLoader',\n        },\n\n        async testParse(asset: SpriteSheetJson, options: ResolvedAsset): Promise<boolean>\n        {\n            return (path.extname(options.src).toLowerCase() === '.json' && !!asset.frames);\n        },\n\n        async parse(\n            asset: SpriteSheetJson,\n            options: ResolvedAsset<{\n                texture?: Texture,\n                imageFilename?: string,\n                ignoreMultiPack?: boolean,\n                textureOptions?: TextureSourceOptions,\n                cachePrefix?: string,\n            }>,\n            loader?: Loader\n        ): 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                textureOptions, // if user need to set texture options on texture\n                cachePrefix, // if user need to use custom cache prefix\n            } = options?.data ?? {};\n\n            let basePath = path.dirname(options.src);\n\n            if (basePath && basePath.lastIndexOf('/') !== (basePath.length - 1))\n            {\n                basePath += '/';\n            }\n\n            let texture: Texture;\n\n            if (imageTexture instanceof Texture)\n            {\n                texture = imageTexture;\n            }\n            else\n            {\n                const imagePath = copySearchParams(basePath + (imageFilename ?? asset.meta.image), options.src);\n\n                const assets = await loader.load<Texture>([{ src: imagePath, data: textureOptions }]);\n\n                texture = assets[imagePath];\n            }\n\n            const spritesheet = new Spritesheet({\n                texture: texture.source,\n                data: asset,\n                cachePrefix\n            });\n\n            await spritesheet.parse();\n\n            // Check and add the multi atlas\n            // Heavily influenced and based on https://github.com/rocket-ua/pixi-tps-loader/blob/master/src/ResourceLoader.js\n            const multiPacks = asset?.meta?.related_multi_packs;\n\n            if (Array.isArray(multiPacks))\n            {\n                const promises: Promise<Spritesheet<SpriteSheetJson>>[] = [];\n\n                for (const item of multiPacks)\n                {\n                    if (typeof item !== 'string')\n                    {\n                        continue;\n                    }\n\n                    let itemUrl = basePath + item;\n\n                    // Check if the file wasn't already added as multipack\n                    if (options.data?.ignoreMultiPack)\n                    {\n                        continue;\n                    }\n\n                    itemUrl = copySearchParams(itemUrl, options.src);\n\n                    promises.push(loader.load<Spritesheet<SpriteSheetJson>>({\n                        src: itemUrl,\n                        data: {\n                            textureOptions,\n                            ignoreMultiPack: true,\n                        }\n                    }));\n                }\n\n                const res = await Promise.all(promises);\n\n                spritesheet.linkedSheets = res;\n                res.forEach((item) =>\n                {\n                    item.linkedSheets = [spritesheet].concat(spritesheet.linkedSheets.filter((sp) => (sp !== item)));\n                });\n            }\n\n            return spritesheet;\n        },\n\n        async unload(spritesheet: Spritesheet, _resolvedAsset, loader)\n        {\n            await loader.unload(spritesheet.textureSource._sourceOrigin);\n\n            spritesheet.destroy(false);\n        },\n    }\n} satisfies AssetExtensionAdvanced<SpriteSheetJson, Spritesheet, Spritesheet, Spritesheet>;\n"],"names":[],"mappings":"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"}