{"version":3,"file":"AbstractMultiResource.mjs","sources":["../../../src/textures/resources/AbstractMultiResource.ts"],"sourcesContent":["import { BaseTexture } from '../BaseTexture';\nimport { autoDetectResource } from './autoDetectResource';\nimport { Resource } from './Resource';\n\nimport type { ISize } from 'pixijs/math';\nimport type { IAutoDetectOptions } from './autoDetectResource';\n\n/**\n * Resource that can manage several resource (items) inside.\n * All resources need to have the same pixel size.\n * Parent class for CubeResource and ArrayResource\n * @memberof PIXI\n */\nexport abstract class AbstractMultiResource extends Resource\n{\n    /** Number of elements in array. */\n    readonly length: number;\n\n    /**\n     * Collection of partial baseTextures that correspond to resources.\n     * @readonly\n     */\n    items: Array<BaseTexture>;\n\n    /**\n     * Dirty IDs for each part.\n     * @readonly\n     */\n    itemDirtyIds: Array<number>;\n\n    /**\n     * Promise when loading.\n     * @default null\n     */\n    private _load: Promise<this>;\n\n    /** Bound baseTexture, there can only be one. */\n    baseTexture: BaseTexture;\n\n    /**\n     * @param length\n     * @param options - Options to for Resource constructor\n     * @param {number} [options.width] - Width of the resource\n     * @param {number} [options.height] - Height of the resource\n     */\n    constructor(length: number, options?: ISize)\n    {\n        const { width, height } = options || {};\n\n        super(width, height);\n\n        this.items = [];\n        this.itemDirtyIds = [];\n\n        for (let i = 0; i < length; i++)\n        {\n            const partTexture = new BaseTexture();\n\n            this.items.push(partTexture);\n            // -2 - first run of texture array upload\n            // -1 - texture item was allocated\n            // >=0 - texture item uploaded , in sync with items[i].dirtyId\n            this.itemDirtyIds.push(-2);\n        }\n\n        this.length = length;\n        this._load = null;\n        this.baseTexture = null;\n    }\n\n    /**\n     * Used from ArrayResource and CubeResource constructors.\n     * @param resources - Can be resources, image elements, canvas, etc. ,\n     *  length should be same as constructor length\n     * @param options - Detect options for resources\n     */\n    protected initFromArray(resources: Array<any>, options?: IAutoDetectOptions): void\n    {\n        for (let i = 0; i < this.length; i++)\n        {\n            if (!resources[i])\n            {\n                continue;\n            }\n            if (resources[i].castToBaseTexture)\n            {\n                this.addBaseTextureAt(resources[i].castToBaseTexture(), i);\n            }\n            else if (resources[i] instanceof Resource)\n            {\n                this.addResourceAt(resources[i], i);\n            }\n            else\n            {\n                this.addResourceAt(autoDetectResource(resources[i], options), i);\n            }\n        }\n    }\n\n    /** Destroy this BaseImageResource. */\n    dispose(): void\n    {\n        for (let i = 0, len = this.length; i < len; i++)\n        {\n            this.items[i].destroy();\n        }\n        this.items = null;\n        this.itemDirtyIds = null;\n        this._load = null;\n    }\n\n    /**\n     * Set a baseTexture by ID\n     * @param baseTexture\n     * @param index - Zero-based index of resource to set\n     * @returns - Instance for chaining\n     */\n    abstract addBaseTextureAt(baseTexture: BaseTexture, index: number): this;\n\n    /**\n     * Set a resource by ID\n     * @param resource\n     * @param index - Zero-based index of resource to set\n     * @returns - Instance for chaining\n     */\n    addResourceAt(resource: Resource, index: number): this\n    {\n        if (!this.items[index])\n        {\n            throw new Error(`Index ${index} is out of bounds`);\n        }\n\n        // Inherit the first resource dimensions\n        if (resource.valid && !this.valid)\n        {\n            this.resize(resource.width, resource.height);\n        }\n\n        this.items[index].setResource(resource);\n\n        return this;\n    }\n\n    /**\n     * Set the parent base texture.\n     * @param baseTexture\n     */\n    bind(baseTexture: BaseTexture): void\n    {\n        if (this.baseTexture !== null)\n        {\n            throw new Error('Only one base texture per TextureArray is allowed');\n        }\n        super.bind(baseTexture);\n\n        for (let i = 0; i < this.length; i++)\n        {\n            this.items[i].parentTextureArray = baseTexture;\n            this.items[i].on('update', baseTexture.update, baseTexture);\n        }\n    }\n\n    /**\n     * Unset the parent base texture.\n     * @param baseTexture\n     */\n    unbind(baseTexture: BaseTexture): void\n    {\n        super.unbind(baseTexture);\n\n        for (let i = 0; i < this.length; i++)\n        {\n            this.items[i].parentTextureArray = null;\n            this.items[i].off('update', baseTexture.update, baseTexture);\n        }\n    }\n\n    /**\n     * Load all the resources simultaneously\n     * @returns - When load is resolved\n     */\n    load(): Promise<this>\n    {\n        if (this._load)\n        {\n            return this._load;\n        }\n\n        const resources = this.items.map((item) => item.resource).filter((item) => item);\n\n        // TODO: also implement load part-by-part strategy\n        const promises = resources.map((item) => item.load());\n\n        this._load = Promise.all(promises)\n            .then(() =>\n            {\n                const { realWidth, realHeight } = this.items[0];\n\n                this.resize(realWidth, realHeight);\n\n                return Promise.resolve(this);\n            }\n            );\n\n        return this._load;\n    }\n}\n"],"names":[],"mappings":";;;;AAaO,MAAe,8BAA8B,QACpD,CAAA;AAAA,EA+BI,WAAA,CAAY,QAAgB,OAC5B,EAAA;AACI,IAAA,MAAM,EAAE,KAAA,EAAO,MAAW,EAAA,GAAA,OAAA,IAAW,EAAC,CAAA;AAEtC,IAAA,KAAA,CAAM,OAAO,MAAM,CAAA,CAAA;AAEnB,IAAA,IAAA,CAAK,QAAQ,EAAC,CAAA;AACd,IAAA,IAAA,CAAK,eAAe,EAAC,CAAA;AAErB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,EAAQ,CAC5B,EAAA,EAAA;AACI,MAAM,MAAA,WAAA,GAAc,IAAI,WAAY,EAAA,CAAA;AAEpC,MAAK,IAAA,CAAA,KAAA,CAAM,KAAK,WAAW,CAAA,CAAA;AAI3B,MAAK,IAAA,CAAA,YAAA,CAAa,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,KAC7B;AAEA,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AACb,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AAAA,GACvB;AAAA,EAQU,aAAc,CAAA,SAAA,EAAuB,OAC/C,EAAA;AACI,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CACjC,EAAA,EAAA;AACI,MAAI,IAAA,CAAC,UAAU,CACf,CAAA,EAAA;AACI,QAAA,SAAA;AAAA,OACJ;AACA,MAAI,IAAA,SAAA,CAAU,GAAG,iBACjB,EAAA;AACI,QAAA,IAAA,CAAK,gBAAiB,CAAA,SAAA,CAAU,CAAG,CAAA,CAAA,iBAAA,IAAqB,CAAC,CAAA,CAAA;AAAA,OAC7D,MAAA,IACS,SAAU,CAAA,CAAA,CAAA,YAAc,QACjC,EAAA;AACI,QAAK,IAAA,CAAA,aAAA,CAAc,SAAU,CAAA,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,OAGtC,MAAA;AACI,QAAA,IAAA,CAAK,cAAc,kBAAmB,CAAA,SAAA,CAAU,CAAI,CAAA,EAAA,OAAO,GAAG,CAAC,CAAA,CAAA;AAAA,OACnE;AAAA,KACJ;AAAA,GACJ;AAAA,EAGA,OACA,GAAA;AACI,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,KAAK,MAAQ,EAAA,CAAA,GAAI,KAAK,CAC5C,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,KAAA,CAAM,GAAG,OAAQ,EAAA,CAAA;AAAA,KAC1B;AACA,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AACb,IAAA,IAAA,CAAK,YAAe,GAAA,IAAA,CAAA;AACpB,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AAAA,GACjB;AAAA,EAgBA,aAAA,CAAc,UAAoB,KAClC,EAAA;AACI,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,KAChB,CAAA,EAAA;AACI,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,MAAA,EAAS,KAAwB,CAAA,iBAAA,CAAA,CAAA,CAAA;AAAA,KACrD;AAGA,IAAA,IAAI,QAAS,CAAA,KAAA,IAAS,CAAC,IAAA,CAAK,KAC5B,EAAA;AACI,MAAA,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,KAAO,EAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,KAC/C;AAEA,IAAK,IAAA,CAAA,KAAA,CAAM,KAAO,CAAA,CAAA,WAAA,CAAY,QAAQ,CAAA,CAAA;AAEtC,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AAAA,EAMA,KAAK,WACL,EAAA;AACI,IAAI,IAAA,IAAA,CAAK,gBAAgB,IACzB,EAAA;AACI,MAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,KACvE;AACA,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA,CAAA;AAEtB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CACjC,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,KAAA,CAAM,GAAG,kBAAqB,GAAA,WAAA,CAAA;AACnC,MAAA,IAAA,CAAK,MAAM,CAAG,CAAA,CAAA,EAAA,CAAG,QAAU,EAAA,WAAA,CAAY,QAAQ,WAAW,CAAA,CAAA;AAAA,KAC9D;AAAA,GACJ;AAAA,EAMA,OAAO,WACP,EAAA;AACI,IAAA,KAAA,CAAM,OAAO,WAAW,CAAA,CAAA;AAExB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CACjC,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,KAAA,CAAM,GAAG,kBAAqB,GAAA,IAAA,CAAA;AACnC,MAAA,IAAA,CAAK,MAAM,CAAG,CAAA,CAAA,GAAA,CAAI,QAAU,EAAA,WAAA,CAAY,QAAQ,WAAW,CAAA,CAAA;AAAA,KAC/D;AAAA,GACJ;AAAA,EAMA,IACA,GAAA;AACI,IAAA,IAAI,KAAK,KACT,EAAA;AACI,MAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AAAA,KAChB;AAEA,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,IAAK,CAAA,QAAQ,CAAE,CAAA,MAAA,CAAO,CAAC,IAAA,KAAS,IAAI,CAAA,CAAA;AAG/E,IAAA,MAAM,WAAW,SAAU,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAEpD,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA,CAC5B,KAAK,MACN;AACI,MAAA,MAAM,EAAE,SAAA,EAAW,UAAe,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,CAAA,CAAA;AAE7C,MAAK,IAAA,CAAA,MAAA,CAAO,WAAW,UAAU,CAAA,CAAA;AAEjC,MAAO,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,KAE/B,CAAA,CAAA;AAEJ,IAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AAAA,GAChB;AACJ;;;;"}