{"version":3,"file":"Spine.mjs","sources":["../src/Spine.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    Assets,\n    Bounds,\n    Cache,\n    Container,\n    ContainerOptions,\n    DEG_TO_RAD,\n    DestroyOptions,\n    PointData,\n    Texture,\n    Ticker,\n    ViewContainer,\n} from 'pixi.js';\nimport { ISpineDebugRenderer } from './SpineDebugRenderer';\nimport {\n    AnimationState,\n    AnimationStateData,\n    AtlasAttachmentLoader,\n    Attachment,\n    Bone,\n    ClippingAttachment,\n    Color,\n    MeshAttachment,\n    Physics,\n    RegionAttachment,\n    Skeleton,\n    SkeletonBinary,\n    SkeletonBounds,\n    SkeletonClipping,\n    SkeletonData,\n    SkeletonJson,\n    Slot,\n    type TextureAtlas,\n    TrackEntry,\n    Vector2,\n} from '@esotericsoftware/spine-core';\n\nexport type SpineFromOptions = {\n    skeleton: string;\n    atlas: string;\n    scale?: number;\n};\n\nconst vectorAux = new Vector2();\nconst lightColor = new Color();\nconst darkColor = new Color();\n\nSkeleton.yDown = true;\n\nconst clipper = new SkeletonClipping();\n\nexport interface SpineOptions extends ContainerOptions\n{\n    skeletonData: SkeletonData;\n    autoUpdate?: boolean;\n}\n\nexport interface SpineEvents\n{\n    complete: [trackEntry: TrackEntry];\n    dispose: [trackEntry: TrackEntry];\n    end: [trackEntry: TrackEntry];\n    event: [trackEntry: TrackEntry, event: Event];\n    interrupt: [trackEntry: TrackEntry];\n    start: [trackEntry: TrackEntry];\n}\n\nexport interface AttachmentCacheData\n{\n    id: string;\n    clipped: boolean;\n    vertices: Float32Array;\n    uvs: Float32Array;\n    indices: number[];\n    color: Color;\n    darkColor: Color | null;\n    darkTint: boolean;\n    skipRender: boolean;\n    texture: Texture;\n    clippedData?: {\n        vertices: Float32Array;\n        uvs: Float32Array;\n        indices: Uint16Array;\n        vertexCount: number;\n        indicesCount: number;\n    };\n}\n\nexport class Spine extends ViewContainer\n{\n    // Pixi properties\n    public batched = true;\n    public buildId = 0;\n    public override readonly renderPipeId = 'spine';\n    public _didSpineUpdate = false;\n\n    public beforeUpdateWorldTransforms: (object: Spine) => void = () => { /** */ };\n    public afterUpdateWorldTransforms: (object: Spine) => void = () => { /** */ };\n\n    // Spine properties\n    public skeleton: Skeleton;\n    public state: AnimationState;\n    public skeletonBounds: SkeletonBounds;\n    private _debug?: ISpineDebugRenderer | undefined = undefined;\n\n    readonly _slotsObject: Record<string, {slot:Slot, container:Container}> = Object.create(null);\n\n    private getSlotFromRef(slotRef: number | string | Slot): Slot\n    {\n        let slot: Slot | null;\n\n        if (typeof slotRef === 'number') slot = this.skeleton.slots[slotRef];\n        else if (typeof slotRef === 'string') slot = this.skeleton.findSlot(slotRef);\n        else slot = slotRef;\n\n        if (!slot) throw new Error(`No slot found with the given slot reference: ${slotRef}`);\n\n        return slot;\n    }\n\n    public spineAttachmentsDirty = true;\n    public spineTexturesDirty = true;\n\n    private _lastAttachments: Attachment[];\n\n    private _stateChanged = true;\n    private attachmentCacheData: Record<string, AttachmentCacheData>[] = [];\n\n    public get debug(): ISpineDebugRenderer | undefined\n    {\n        return this._debug;\n    }\n\n    public set debug(value: ISpineDebugRenderer | undefined)\n    {\n        if (this._debug)\n        {\n            this._debug.unregisterSpine(this);\n        }\n        if (value)\n        {\n            value.registerSpine(this);\n        }\n        this._debug = value;\n    }\n\n    private autoUpdateWarned = false;\n    private _autoUpdate = true;\n\n    public get autoUpdate(): boolean\n    {\n        return this._autoUpdate;\n    }\n\n    public set autoUpdate(value: boolean)\n    {\n        if (value)\n        {\n            Ticker.shared.add(this.internalUpdate, this);\n            this.autoUpdateWarned = false;\n        }\n        else\n        {\n            Ticker.shared.remove(this.internalUpdate, this);\n        }\n\n        this._autoUpdate = value;\n    }\n\n    constructor(options: SpineOptions | SkeletonData)\n    {\n        if (options instanceof SkeletonData)\n        {\n            options = {\n                skeletonData: options,\n            };\n        }\n\n        super();\n\n        const skeletonData = options instanceof SkeletonData ? options : options.skeletonData;\n\n        this.skeleton = new Skeleton(skeletonData);\n        this.state = new AnimationState(new AnimationStateData(skeletonData));\n        this.autoUpdate = options?.autoUpdate ?? true;\n\n        const slots = this.skeleton.slots;\n\n        for (let i = 0; i < slots.length; i++)\n        {\n            this.attachmentCacheData[i] = Object.create(null);\n        }\n\n        this._updateState(0);\n    }\n\n    public update(dt: number): void\n    {\n        if (this.autoUpdate && !this.autoUpdateWarned)\n        {\n            console.warn(\n                // eslint-disable-next-line max-len\n                'You are calling update on a Spine instance that has autoUpdate set to true. This is probably not what you want.',\n            );\n            this.autoUpdateWarned = true;\n        }\n\n        this.internalUpdate(0, dt);\n    }\n\n    protected internalUpdate(_deltaFrame: any, deltaSeconds?: number): void\n    {\n        // Because reasons, pixi uses deltaFrames at 60fps.\n        // We ignore the default deltaFrames and use the deltaSeconds from pixi ticker.\n        this._updateState(deltaSeconds ?? Ticker.shared.deltaMS / 1000);\n    }\n\n    get bounds()\n    {\n        if (this._boundsDirty)\n        {\n            this.updateBounds();\n        }\n\n        return this._bounds;\n    }\n\n    public setBonePosition(bone: string | Bone, position: PointData): void\n    {\n        const boneAux = bone;\n\n        if (typeof bone === 'string')\n        {\n            bone = this.skeleton.findBone(bone) as Bone;\n        }\n\n        if (!bone) throw Error(`Cant set bone position, bone ${String(boneAux)} not found`);\n        vectorAux.set(position.x, position.y);\n\n        if (bone.parent)\n        {\n            const aux = bone.parent.worldToLocal(vectorAux);\n\n            bone.x = aux.x;\n            bone.y = -aux.y;\n        }\n        else\n        {\n            bone.x = vectorAux.x;\n            bone.y = vectorAux.y;\n        }\n    }\n\n    public getBonePosition(bone: string | Bone, outPos?: PointData): PointData | undefined\n    {\n        const boneAux = bone;\n\n        if (typeof bone === 'string')\n        {\n            bone = this.skeleton.findBone(bone) as Bone;\n        }\n\n        if (!bone)\n        {\n            console.error(`Cant set bone position! Bone ${String(boneAux)} not found`);\n\n            return outPos;\n        }\n\n        if (!outPos)\n        {\n            outPos = { x: 0, y: 0 };\n        }\n\n        outPos.x = bone.worldX;\n        outPos.y = bone.worldY;\n\n        return outPos;\n    }\n\n    /**\n     * Will update the state based on the specified time, this will not apply the state to the skeleton\n     * as this is differed until the `applyState` method is called.\n     *\n     * @param time the time at which to set the state\n     * @internal\n     */\n    _updateState(time: number)\n    {\n        this.state.update(time);\n        this.skeleton.update(time);\n\n        this._stateChanged = true;\n\n        this._boundsDirty = true;\n\n        this.onViewUpdate();\n    }\n\n    /**\n     * Applies the state to this spine instance.\n     * - updates the state to the skeleton\n     * - updates its world transform (spine world transform)\n     * - validates the attachments - to flag if the attachments have changed this state\n     * - transforms the attachments - to update the vertices of the attachments based on the new positions\n     * - update the slot attachments - to update the position, rotation, scale, and visibility of the attached containers\n     * @internal\n     */\n    _applyState()\n    {\n        if (!this._stateChanged) return;\n        this._stateChanged = false;\n\n        const { skeleton } = this;\n\n        this.state.apply(skeleton);\n\n        this.beforeUpdateWorldTransforms(this);\n        skeleton.updateWorldTransform(Physics.update);\n        this.afterUpdateWorldTransforms(this);\n\n        this.validateAttachments();\n\n        this.transformAttachments();\n\n        this.updateSlotObjects();\n    }\n\n    private validateAttachments()\n    {\n        const currentDrawOrder = this.skeleton.drawOrder;\n\n        const lastAttachments = (this._lastAttachments ||= []);\n\n        let index = 0;\n\n        let spineAttachmentsDirty = false;\n\n        for (let i = 0; i < currentDrawOrder.length; i++)\n        {\n            const slot = currentDrawOrder[i];\n            const attachment = slot.getAttachment();\n\n            if (attachment)\n            {\n                if (attachment !== lastAttachments[index])\n                {\n                    spineAttachmentsDirty = true;\n                    lastAttachments[index] = attachment;\n                }\n\n                index++;\n            }\n        }\n\n        if (index !== lastAttachments.length)\n        {\n            spineAttachmentsDirty = true;\n            lastAttachments.length = index;\n        }\n\n        this.spineAttachmentsDirty = spineAttachmentsDirty;\n    }\n\n    private transformAttachments()\n    {\n        const currentDrawOrder = this.skeleton.drawOrder;\n\n        for (let i = 0; i < currentDrawOrder.length; i++)\n        {\n            const slot = currentDrawOrder[i];\n\n            const attachment = slot.getAttachment();\n\n            if (attachment)\n            {\n                if (attachment instanceof MeshAttachment || attachment instanceof RegionAttachment)\n                {\n                    const cacheData = this._getCachedData(slot, attachment);\n\n                    if (attachment instanceof RegionAttachment)\n                    {\n                        attachment.computeWorldVertices(slot, cacheData.vertices, 0, 2);\n                    }\n                    else\n                    {\n                        attachment.computeWorldVertices(\n                            slot,\n                            0,\n                            attachment.worldVerticesLength,\n                            cacheData.vertices,\n                            0,\n                            2,\n                        );\n                    }\n\n                    cacheData.uvs = attachment.uvs as Float32Array;\n\n                    const skeleton = slot.bone.skeleton;\n                    const skeletonColor = skeleton.color;\n                    const slotColor = slot.color;\n\n                    const attachmentColor = attachment.color;\n\n                    cacheData.color.set(\n                        skeletonColor.r * slotColor.r * attachmentColor.r,\n                        skeletonColor.g * slotColor.g * attachmentColor.g,\n                        skeletonColor.b * slotColor.b * attachmentColor.b,\n                        skeletonColor.a * slotColor.a * attachmentColor.a,\n                    );\n\n                    cacheData.darkTint = !!slot.darkColor;\n\n                    if (slot.darkColor)\n                    {\n                        cacheData.darkColor.setFromColor(slot.darkColor);\n                    }\n\n                    cacheData.skipRender = cacheData.clipped = false;\n\n                    const texture = attachment.region?.texture.texture || Texture.EMPTY;\n\n                    if (cacheData.texture !== texture)\n                    {\n                        cacheData.texture = texture;\n                        this.spineTexturesDirty = true;\n                    }\n\n                    if (clipper.isClipping())\n                    {\n                        this.updateClippingData(cacheData);\n                    }\n                }\n                else if (attachment instanceof ClippingAttachment)\n                {\n                    clipper.clipStart(slot, attachment);\n                    continue;\n                }\n            }\n            clipper.clipEndWithSlot(slot);\n        }\n        clipper.clipEnd();\n    }\n\n    private updateClippingData(cacheData: AttachmentCacheData)\n    {\n        cacheData.clipped = true;\n\n        clipper.clipTriangles(\n            cacheData.vertices,\n            cacheData.vertices.length,\n            cacheData.indices,\n            cacheData.indices.length,\n            cacheData.uvs,\n            lightColor,\n            darkColor,\n            false,\n        );\n\n        const { clippedVertices, clippedTriangles } = clipper;\n\n        const verticesCount = clippedVertices.length / 8;\n        const indicesCount = clippedTriangles.length;\n\n        if (!cacheData.clippedData)\n        {\n            cacheData.clippedData = {\n                vertices: new Float32Array(verticesCount * 2),\n                uvs: new Float32Array(verticesCount * 2),\n                vertexCount: verticesCount,\n                indices: new Uint16Array(indicesCount),\n                indicesCount,\n            };\n\n            this.spineAttachmentsDirty = true;\n        }\n\n        const clippedData = cacheData.clippedData;\n\n        const sizeChange = clippedData.vertexCount !== verticesCount || indicesCount !== clippedData.indicesCount;\n\n        cacheData.skipRender = verticesCount === 0;\n\n        if (sizeChange)\n        {\n            this.spineAttachmentsDirty = true;\n\n            if (clippedData.vertexCount < verticesCount)\n            {\n                // buffer reuse!\n                clippedData.vertices = new Float32Array(verticesCount * 2);\n                clippedData.uvs = new Float32Array(verticesCount * 2);\n            }\n\n            if (clippedData.indices.length < indicesCount)\n            {\n                clippedData.indices = new Uint16Array(indicesCount);\n            }\n        }\n\n        const { vertices, uvs, indices } = clippedData;\n\n        for (let i = 0; i < verticesCount; i++)\n        {\n            vertices[i * 2] = clippedVertices[i * 8];\n            vertices[(i * 2) + 1] = clippedVertices[(i * 8) + 1];\n\n            uvs[i * 2] = clippedVertices[(i * 8) + 6];\n            uvs[(i * 2) + 1] = clippedVertices[(i * 8) + 7];\n        }\n\n        clippedData.vertexCount = verticesCount;\n\n        for (let i = 0; i < indices.length; i++)\n        {\n            indices[i] = clippedTriangles[i];\n        }\n\n        clippedData.indicesCount = indicesCount;\n    }\n\n    /**\n     * ensure that attached containers map correctly to their slots\n     * along with their position, rotation, scale, and visibility.\n     */\n    private updateSlotObjects()\n    {\n        for (const i in this._slotsObject)\n        {\n            const slotAttachment = this._slotsObject[i];\n\n            if (!slotAttachment) continue;\n\n            this.updateSlotObject(slotAttachment);\n        }\n    }\n\n    private updateSlotObject(slotAttachment: {slot:Slot, container:Container})\n    {\n        const { slot, container } = slotAttachment;\n\n        container.visible = this.skeleton.drawOrder.includes(slot);\n\n        if (container.visible)\n        {\n            const bone = slot.bone;\n\n            container.position.set(bone.worldX, bone.worldY);\n\n            container.scale.x = bone.getWorldScaleX();\n            container.scale.y = bone.getWorldScaleY();\n\n            container.rotation = bone.getWorldRotationX() * DEG_TO_RAD;\n        }\n    }\n\n    /** @internal */\n    _getCachedData(slot: Slot, attachment: RegionAttachment | MeshAttachment): AttachmentCacheData\n    {\n        return this.attachmentCacheData[slot.data.index][attachment.name] || this.initCachedData(slot, attachment);\n    }\n\n    private initCachedData(slot: Slot, attachment: RegionAttachment | MeshAttachment): AttachmentCacheData\n    {\n        let vertices: Float32Array;\n\n        if (attachment instanceof RegionAttachment)\n        {\n            vertices = new Float32Array(8);\n\n            this.attachmentCacheData[slot.data.index][attachment.name] = {\n                id: `${slot.data.index}-${attachment.name}`,\n                vertices,\n                clipped: false,\n                indices: [0, 1, 2, 0, 2, 3],\n                uvs: attachment.uvs as Float32Array,\n                color: new Color(1, 1, 1, 1),\n                darkColor: new Color(0, 0, 0, 0),\n                darkTint: false,\n                skipRender: false,\n                texture: attachment.region?.texture.texture,\n            };\n        }\n        else\n        {\n            vertices = new Float32Array(attachment.worldVerticesLength);\n\n            this.attachmentCacheData[slot.data.index][attachment.name] = {\n                id: `${slot.data.index}-${attachment.name}`,\n                vertices,\n                clipped: false,\n                indices: attachment.triangles,\n                uvs: attachment.uvs as Float32Array,\n                color: new Color(1, 1, 1, 1),\n                darkColor: new Color(0, 0, 0, 0),\n                darkTint: false,\n                skipRender: false,\n                texture: attachment.region?.texture.texture,\n            };\n        }\n\n        return this.attachmentCacheData[slot.data.index][attachment.name];\n    }\n\n    protected onViewUpdate()\n    {\n        // increment from the 12th bit!\n        this._didChangeId += 1 << 12;\n\n        this._boundsDirty = true;\n\n        if (this.didViewUpdate) return;\n        this.didViewUpdate = true;\n\n        const renderGroup = this.renderGroup || this.parentRenderGroup;\n\n        if (renderGroup)\n        {\n            renderGroup.onChildViewUpdate(this);\n        }\n\n        this.debug?.renderDebug(this);\n    }\n\n    /**\n     * Attaches a PixiJS container to a specified slot. This will map the world transform of the slots bone\n     * to the attached container. A container can only be attached to one slot at a time.\n     *\n     * @param container - The container to attach to the slot\n     * @param slotRef - The slot id or  slot to attach to\n     */\n    public addSlotObject(slot: number | string | Slot, container: Container)\n    {\n        slot = this.getSlotFromRef(slot);\n\n        // need to check in on the container too...\n        for (const i in this._slotsObject)\n        {\n            if (this._slotsObject[i]?.container === container)\n            {\n                this.removeSlotObject(this._slotsObject[i].slot);\n            }\n        }\n\n        this.removeSlotObject(slot);\n\n        container.includeInBuild = false;\n\n        // TODO only add once??\n        this.addChild(container);\n\n        this._slotsObject[slot.data.name] = {\n            container,\n            slot\n        };\n\n        this.updateSlotObject(this._slotsObject[slot.data.name]);\n    }\n\n    /**\n     * Removes a PixiJS container from the slot it is attached to.\n     *\n     * @param container - The container to detach from the slot\n     * @param slotOrContainer - The container, slot id or slot to detach from\n     */\n    public removeSlotObject(slotOrContainer: number | string | Slot | Container)\n    {\n        let containerToRemove: Container | undefined;\n\n        if (slotOrContainer instanceof Container)\n        {\n            for (const i in this._slotsObject)\n            {\n                if (this._slotsObject[i]?.container === slotOrContainer)\n                {\n                    this._slotsObject[i] = null;\n\n                    containerToRemove = slotOrContainer;\n                    break;\n                }\n            }\n        }\n        else\n        {\n            const slot = this.getSlotFromRef(slotOrContainer);\n\n            containerToRemove = this._slotsObject[slot.data.name]?.container;\n            this._slotsObject[slot.data.name] = null;\n        }\n\n        if (containerToRemove)\n        {\n            this.removeChild(containerToRemove);\n\n            containerToRemove.includeInBuild = true;\n        }\n    }\n\n    /**\n     * Returns a container attached to a slot, or undefined if no container is attached.\n     *\n     * @param slotRef - The slot id or slot to get the attachment from\n     * @returns - The container attached to the slot\n     */\n    public getSlotObject(slot: number | string | Slot)\n    {\n        slot = this.getSlotFromRef(slot);\n\n        return this._slotsObject[slot.data.name].container;\n    }\n\n    private updateBounds()\n    {\n        this._boundsDirty = false;\n\n        this.skeletonBounds ||= new SkeletonBounds();\n\n        const skeletonBounds = this.skeletonBounds;\n\n        skeletonBounds.update(this.skeleton, true);\n\n        if (skeletonBounds.minX === Infinity)\n        {\n            this._applyState();\n\n            const drawOrder = this.skeleton.drawOrder;\n            const bounds = this._bounds;\n\n            bounds.clear();\n\n            for (let i = 0; i < drawOrder.length; i++)\n            {\n                const slot = drawOrder[i];\n\n                const attachment = slot.getAttachment();\n\n                if (attachment && (attachment instanceof RegionAttachment || attachment instanceof MeshAttachment))\n                {\n                    const cacheData = this._getCachedData(slot, attachment);\n\n                    bounds.addVertexData(cacheData.vertices, 0, cacheData.vertices.length);\n                }\n            }\n        }\n        else\n        {\n            this._bounds.minX = skeletonBounds.minX;\n            this._bounds.minY = skeletonBounds.minY;\n            this._bounds.maxX = skeletonBounds.maxX;\n            this._bounds.maxY = skeletonBounds.maxY;\n        }\n    }\n\n    /** @internal */\n    addBounds(bounds: Bounds)\n    {\n        bounds.addBounds(this.bounds);\n    }\n\n    /**\n     * Destroys this sprite renderable and optionally its texture.\n     * @param options - Options parameter. A boolean will act as if all options\n     *  have been set to that value\n     * @param {boolean} [options.texture=false] - Should it destroy the current texture of the renderable as well\n     * @param {boolean} [options.textureSource=false] - Should it destroy the textureSource of the renderable as well\n     */\n    public override destroy(options: DestroyOptions = false)\n    {\n        super.destroy(options);\n\n        Ticker.shared.remove(this.internalUpdate, this);\n        this.state.clearListeners();\n        this.debug = undefined;\n        this.skeleton = null as any;\n        this.state = null as any;\n        (this._slotsObject as any) = null;\n        this._lastAttachments = null;\n        this.attachmentCacheData = null as any;\n    }\n\n    /** Converts a point from the skeleton coordinate system to the Pixi world coordinate system. */\n    public skeletonToPixiWorldCoordinates(point: { x: number; y: number })\n    {\n        this.worldTransform.apply(point, point);\n    }\n\n    /** Converts a point from the Pixi world coordinate system to the skeleton coordinate system. */\n    public pixiWorldCoordinatesToSkeleton(point: { x: number; y: number })\n    {\n        this.worldTransform.applyInverse(point, point);\n    }\n\n    /** Converts a point from the Pixi world coordinate system to the bone's local coordinate system. */\n    public pixiWorldCoordinatesToBone(point: { x: number; y: number }, bone: Bone)\n    {\n        this.pixiWorldCoordinatesToSkeleton(point);\n        if (bone.parent)\n        {\n            bone.parent.worldToLocal(point as Vector2);\n        }\n        else\n        {\n            bone.worldToLocal(point as Vector2);\n        }\n    }\n\n    static from({ skeleton, atlas, scale = 1 }: SpineFromOptions)\n    {\n        const cacheKey = `${skeleton}-${atlas}-${scale}`;\n\n        if (Cache.has(cacheKey))\n        {\n            return new Spine(Cache.get<SkeletonData>(cacheKey));\n        }\n\n        const skeletonAsset = Assets.get<any | Uint8Array>(skeleton);\n\n        const atlasAsset = Assets.get<TextureAtlas>(atlas);\n        const attachmentLoader = new AtlasAttachmentLoader(atlasAsset);\n        // eslint-disable-next-line max-len\n        const parser\n            = skeletonAsset instanceof Uint8Array\n                ? new SkeletonBinary(attachmentLoader)\n                : new SkeletonJson(attachmentLoader);\n\n        // TODO scale?\n        parser.scale = scale;\n        const skeletonData = parser.readSkeletonData(skeletonAsset);\n\n        Cache.set(cacheKey, skeletonData);\n\n        return new Spine({\n            skeletonData,\n        });\n    }\n}\n"],"names":[],"mappings":"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"}