{"version":3,"file":"atlasLoader.mjs","sources":["../../src/assets/atlasLoader.ts"],"sourcesContent":["/** ****************************************************************************\n * Spine Runtimes License Agreement\n * Last updated July 28, 2023. Replaces all prior versions.\n *\n * Copyright (c) 2013-2023, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software or\n * otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE\n * SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport {\n    checkExtension,\n    DOMAdapter,\n    extensions,\n    ExtensionType,\n    LoaderParserPriority,\n    path,\n    TextureSource\n} from 'pixi.js';\nimport { SpineTexture } from '../SpineTexture';\nimport { TextureAtlas } from '@esotericsoftware/spine-core';\n\nimport type { AssetExtension, Loader, ResolvedAsset, Texture } from 'pixi.js';\n\ntype RawAtlas = string;\n\nconst spineTextureAtlasLoader: AssetExtension<RawAtlas | TextureAtlas, ISpineAtlasMetadata> = {\n    extension: ExtensionType.Asset,\n\n    loader: {\n        extension: {\n            type: ExtensionType.LoadParser,\n            priority: LoaderParserPriority.Normal,\n            name: 'spineTextureAtlasLoader',\n        },\n\n        test(url: string): boolean\n        {\n            return checkExtension(url, '.atlas');\n        },\n\n        async load(url: string): Promise<RawAtlas>\n        {\n            const response = await DOMAdapter.get().fetch(url);\n\n            const txt = await response.text();\n\n            return txt;\n        },\n\n        testParse(asset: unknown, options: ResolvedAsset): Promise<boolean>\n        {\n            const isExtensionRight = checkExtension(options.src as string, '.atlas');\n            const isString = typeof asset === 'string';\n\n            return Promise.resolve(isExtensionRight && isString);\n        },\n\n        unload(atlas: TextureAtlas)\n        {\n            atlas.dispose();\n        },\n\n        async parse(asset: RawAtlas, options: ResolvedAsset, loader: Loader): Promise<TextureAtlas>\n        {\n            const metadata: ISpineAtlasMetadata = options.data || {};\n            let basePath = path.dirname(options.src as string);\n\n            if (basePath && basePath.lastIndexOf('/') !== basePath.length - 1)\n            {\n                basePath += '/';\n            }\n\n            // Retval is going to be a texture atlas. However we need to wait for it's callback to resolve this promise.\n            const retval = new TextureAtlas(asset);\n\n            // If the user gave me only one texture, that one is assumed to be the \"first\" texture in the atlas\n            if (metadata.images instanceof TextureSource || typeof metadata.images === 'string')\n            {\n                const pixiTexture = metadata.images;\n\n                metadata.images = {} as Record<string, TextureSource | string>;\n                metadata.images[retval.pages[0].name] = pixiTexture;\n            }\n\n            // we will wait for all promises for the textures at the same time at the end.\n            const textureLoadingPromises:Promise<any>[] = [];\n\n            // fill the pages\n            for (const page of retval.pages)\n            {\n                const pageName = page.name;\n                const providedPage = metadata?.images ? metadata.images[pageName] : undefined;\n\n                if (providedPage instanceof TextureSource)\n                {\n                    page.setTexture(SpineTexture.from(providedPage));\n                }\n                else\n                {\n                    // eslint-disable-next-line max-len\n                    const url: string = providedPage ?? path.normalize([...basePath.split(path.sep), pageName].join(path.sep));\n\n                    const assetsToLoadIn = {\n                        src: url,\n                        data: {\n                            ...metadata.imageMetadata,\n                            alphaMode: page.pma ? 'premultiplied-alpha' : 'premultiply-alpha-on-upload'\n                        }\n                    };\n\n                    const pixiPromise = loader.load<Texture>(assetsToLoadIn).then((texture) =>\n                    {\n                        page.setTexture(SpineTexture.from(texture.source));\n                    });\n\n                    textureLoadingPromises.push(pixiPromise);\n                }\n            }\n\n            await Promise.all(textureLoadingPromises);\n\n            return retval;\n        },\n    },\n} as AssetExtension<RawAtlas | TextureAtlas, ISpineAtlasMetadata>;\n\nextensions.add(spineTextureAtlasLoader);\n\nexport interface ISpineAtlasMetadata\n{\n    // If you are downloading an .atlas file, this metadata will go to the Texture loader\n    imageMetadata?: any;\n    // If you already have atlas pages loaded as pixi textures\n    // and want to use that to create the atlas, you can pass them here\n    images?: TextureSource | string | Record<string, TextureSource | string>;\n}\n"],"names":[],"mappings":"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"}