{"version":3,"file":"load.mjs","sources":["../../src/animate/load.ts"],"sourcesContent":["import type { Container } from '@pixi/display';\nimport type { AnimateAsset } from '../AnimateAsset';\nimport type { MovieClip } from './MovieClip';\nimport type { DrawCommands } from './Graphics';\nimport { utils } from './utils';\nimport { Assets } from '@pixi/assets';\nimport { Texture } from '@pixi/core';\nimport { Spritesheet } from '@pixi/spritesheet';\n\ntype Complete = (instance: MovieClip | null) => void;\ntype Progress = (value: number) => void;\nexport interface LoadOptions\n{\n    /**\n     * The Container to auto-add the stage to, if createInstance is true.\n     */\n    parent?: Container;\n    /**\n     * Callback for load completion.\n     */\n    complete?: Complete;\n    /**\n     * Callback for load progress.\n     */\n    progress?: Progress;\n    /**\n     * Base root directory\n     */\n    basePath?: string;\n    /**\n     * Enable or disable automatic instantiation of stage - defaults to false.\n     */\n    createInstance?: boolean;\n    /**\n     * Metadata to be handed off to the loader for assets that are loaded.\n     */\n    metadata?: any;\n}\n\nconst EXPECTED_ASSET_VERSION = 2;\n\n/**\n * Load the stage class and preload any assets\n * ```\n * import MyAsset from './myAsset.js';\n * let renderer = new PIXI.autoDetectRenderer(1280, 720);\n * let stage = new PIXI.Container();\n * PIXI.animate.load(MyAsset, function(asset){\n *     stage.addChild(new asset.stage());\n * });\n * function update() {\n *      renderer.render(stage);\n *      update();\n * }\n * update();\n * ```\n * @param scene - Reference to the scene data.\n * @param complete - The callback function when complete.\n * @return instance of PIXI resource loader\n */\nexport function load(scene: AnimateAsset, complete?: Complete): void;\n/**\n * Load the stage class and preload any assets\n * ```\n * import MyAsset from './myAsset.js';\n * let basePath = 'file:/path/to/assets';\n * let renderer = new PIXI.Renderer(1280, 720);\n *\n * let extensions = PIXI.compressedTextures.detectExtensions(renderer);\n * let loader = new PIXI.Loader();\n * // this is an example of setting up a pre loader plugin to handle compressed textures in this case\n * loader.pre(PIXI.compressedTextures.extensionChooser(extensions));\n *\n * // specify metadata this way if you want to provide a default loading strategy for all assets listed in the PIXI animation\n * let metadata = { default: { metadata: { imageMetadata: { choice: ['.crn'] } } } };\n * // specify metadata this way if you want to provide a specific loading strategy for a\n * // certain asset listed inside the PIXI animation library\n * let metadata = { MyStage_atlas_1: { metadata: { imageMetadata: { choice: ['.crn'] } } } };\n *\n * let stage = new PIXI.Container();\n * PIXI.animate.load(MyAsset, {\n *     parent: stage,\n *     complete: ()=>{},\n *     basePath: basePath,\n *     loader: loader,\n *     metadata: metadata\n * });\n * function update() {\n *      renderer.render(stage);\n *      update();\n * }\n * update();\n * ```\n * @param scene - Reference to the scene data.\n * @param options - Options for loading.\n * @return instance of PIXI resource loader\n */\nexport function load(scene: AnimateAsset, options: LoadOptions): void;\nexport function load(scene: AnimateAsset, optionsOrComplete?: Complete | LoadOptions): void\n{\n    const complete: Complete = typeof optionsOrComplete === 'function' ? optionsOrComplete : optionsOrComplete?.complete;\n    const progress: Progress | undefined = typeof optionsOrComplete === 'function' ? undefined : optionsOrComplete?.progress;\n\n    let basePath = '';\n    let parent: Container = null;\n    let metadata: any;\n    let createInstance = false;\n\n    // check scene and warn about it\n    const { version } = scene;\n\n    if (typeof version === 'number')\n    {\n        /* eslint-disable max-len */\n        if (Math.floor(version) !== Math.floor(EXPECTED_ASSET_VERSION))\n        {\n            console.warn(`Asset version is not the major version expected of ${Math.floor(EXPECTED_ASSET_VERSION)} - it may not load properly`, scene);\n        }\n        else if (version > EXPECTED_ASSET_VERSION)\n        {\n            console.warn('Asset has been published with a newer version than PixiAnimate expects. It may not load properly.', scene);\n        }\n        /* eslint-enable max-len */\n    }\n\n    if (optionsOrComplete && typeof optionsOrComplete !== 'function')\n    {\n        basePath = optionsOrComplete.basePath || '';\n        parent = optionsOrComplete.parent;\n        metadata = optionsOrComplete.metadata;\n        createInstance = !!optionsOrComplete.createInstance;\n    }\n\n    function done(): void\n    {\n        const instance = (createInstance && typeof scene.stage === 'function') ? new scene.stage() : null;\n\n        if (parent && instance)\n        {\n            parent.addChild(instance);\n        }\n        if (complete)\n        {\n            complete(instance);\n        }\n    }\n\n    // Check for assets to preload\n    const assets = scene.assets || {};\n\n    if (assets && Object.keys(assets).length)\n    {\n        let totalAssets = 0;\n        let loadedAssets = 0;\n\n        const promises: Promise<any>[] = [];\n        // assetBaseDir can accept either with trailing slash or not\n\n        if (basePath)\n        {\n            basePath += '/';\n        }\n        for (const id in assets)\n        {\n            if (progress) totalAssets++;\n\n            let data = null;\n\n            if (metadata)\n            {\n                // if the metadata was supplied for this particular asset, use these options\n                if (metadata[id])\n                {\n                    data = metadata[id];\n                }\n                // if the metadata supplied a default option\n                else if (metadata.default)\n                {\n                    data = metadata.default;\n                }\n            }\n            promises.push(Assets.load({ alias: [id], src: basePath + assets[id], data }).then((loadedAsset) =>\n            {\n                if (progress)\n                {\n                    loadedAssets++;\n\n                    progress(loadedAssets / totalAssets);\n                }\n\n                if (!loadedAsset)\n                {\n                    return; // not sure if this can ever happen\n                }\n                if (loadedAsset instanceof Spritesheet)\n                {\n                    scene.spritesheets.push(loadedAsset);\n                }\n                else if (loadedAsset instanceof Texture)\n                {\n                    scene.textures[id] = loadedAsset;\n                }\n                else if (Array.isArray(loadedAsset) || typeof loadedAsset === 'string')\n                {\n                    // save shape data\n                    let items: string | DrawCommands[] = loadedAsset;\n\n                    // Decode string to map of files\n                    if (typeof items === 'string')\n                    {\n                        items = utils.deserializeShapes(items);\n                    }\n\n                    // Convert all hex string colors (animate) to int (pixi.js)\n                    for (let i = 0; i < items.length; i++)\n                    {\n                        const item = items[i];\n\n                        for (let j = 0; j < item.length; j++)\n                        {\n                            const arg = item[j];\n\n                            if (typeof arg === 'string' && arg[0] === '#')\n                            {\n                                item[j] = utils.hexToUint(arg);\n                            }\n                        }\n                    }\n                    scene.shapes[id] = items;\n                }\n            }));\n        }\n        Promise.all(promises).then(done);\n    }\n    else\n    {\n        // tiny case where there's only text and no shapes/animations\n        done();\n    }\n}\n"],"names":[],"mappings":"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"}