{"version":3,"file":"Skin.mjs","sources":["../../src/core/Skin.ts"],"sourcesContent":["import { Attachment, MeshAttachment } from './attachments';\nimport type { BoneData } from './BoneData';\nimport type { ConstraintData } from './Constraint';\nimport type { Skeleton } from './Skeleton';\n\nimport type { Map, ISkin } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class SkinEntry {\n    constructor(public slotIndex: number, public name: string, public attachment: Attachment) {}\n}\n\n/**\n * @public\n */\nexport class Skin implements ISkin {\n    name: string;\n    attachments = new Array<Map<Attachment>>();\n    bones = Array<BoneData>();\n    constraints = new Array<ConstraintData>();\n\n    constructor(name: string) {\n        if (name == null) throw new Error('name cannot be null.');\n        this.name = name;\n    }\n\n    setAttachment(slotIndex: number, name: string, attachment: Attachment) {\n        if (attachment == null) throw new Error('attachment cannot be null.');\n        const attachments = this.attachments;\n\n        if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;\n        if (!attachments[slotIndex]) attachments[slotIndex] = {};\n        attachments[slotIndex][name] = attachment;\n    }\n\n    addSkin(skin: Skin) {\n        for (let i = 0; i < skin.bones.length; i++) {\n            const bone = skin.bones[i];\n            let contained = false;\n\n            for (let j = 0; j < this.bones.length; j++) {\n                if (this.bones[j] == bone) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.bones.push(bone);\n        }\n\n        for (let i = 0; i < skin.constraints.length; i++) {\n            const constraint = skin.constraints[i];\n            let contained = false;\n\n            for (let j = 0; j < this.constraints.length; j++) {\n                if (this.constraints[j] == constraint) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.constraints.push(constraint);\n        }\n\n        const attachments = skin.getAttachments();\n\n        for (let i = 0; i < attachments.length; i++) {\n            const attachment = attachments[i];\n\n            this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n        }\n    }\n\n    copySkin(skin: Skin) {\n        for (let i = 0; i < skin.bones.length; i++) {\n            const bone = skin.bones[i];\n            let contained = false;\n\n            for (let j = 0; j < this.bones.length; j++) {\n                if (this.bones[j] == bone) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.bones.push(bone);\n        }\n\n        for (let i = 0; i < skin.constraints.length; i++) {\n            const constraint = skin.constraints[i];\n            let contained = false;\n\n            for (let j = 0; j < this.constraints.length; j++) {\n                if (this.constraints[j] == constraint) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.constraints.push(constraint);\n        }\n\n        const attachments = skin.getAttachments();\n\n        for (let i = 0; i < attachments.length; i++) {\n            const attachment = attachments[i];\n\n            if (attachment.attachment == null) continue;\n            if (attachment.attachment instanceof MeshAttachment) {\n                attachment.attachment = attachment.attachment.newLinkedMesh();\n                this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n            } else {\n                attachment.attachment = attachment.attachment.copy();\n                this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n            }\n        }\n    }\n\n    /** @return May be null. */\n    getAttachment(slotIndex: number, name: string): Attachment {\n        const dictionary = this.attachments[slotIndex];\n\n        return dictionary ? dictionary[name] : null;\n    }\n\n    removeAttachment(slotIndex: number, name: string) {\n        const dictionary = this.attachments[slotIndex];\n\n        if (dictionary) dictionary[name] = null;\n    }\n\n    getAttachments(): Array<SkinEntry> {\n        const entries = new Array<SkinEntry>();\n\n        for (let i = 0; i < this.attachments.length; i++) {\n            const slotAttachments = this.attachments[i];\n\n            if (slotAttachments) {\n                for (const name in slotAttachments) {\n                    const attachment = slotAttachments[name];\n\n                    if (attachment) entries.push(new SkinEntry(i, name, attachment));\n                }\n            }\n        }\n\n        return entries;\n    }\n\n    getAttachmentsForSlot(slotIndex: number, attachments: Array<SkinEntry>) {\n        const slotAttachments = this.attachments[slotIndex];\n\n        if (slotAttachments) {\n            for (const name in slotAttachments) {\n                const attachment = slotAttachments[name];\n\n                if (attachment) attachments.push(new SkinEntry(slotIndex, name, attachment));\n            }\n        }\n    }\n\n    clear() {\n        this.attachments.length = 0;\n        this.bones.length = 0;\n        this.constraints.length = 0;\n    }\n\n    /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */\n    attachAll(skeleton: Skeleton, oldSkin: Skin) {\n        let slotIndex = 0;\n\n        for (let i = 0; i < skeleton.slots.length; i++) {\n            const slot = skeleton.slots[i];\n            const slotAttachment = slot.getAttachment();\n\n            if (slotAttachment && slotIndex < oldSkin.attachments.length) {\n                const dictionary = oldSkin.attachments[slotIndex];\n\n                for (const key in dictionary) {\n                    const skinAttachment: Attachment = dictionary[key];\n\n                    if (slotAttachment == skinAttachment) {\n                        const attachment = this.getAttachment(slotIndex, key);\n\n                        if (attachment != null) slot.setAttachment(attachment);\n                        break;\n                    }\n                }\n            }\n            slotIndex++;\n        }\n    }\n}\n"],"names":[],"mappings":"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"}