@pixi-spine/base
Version:
Base of pixi-spine integration, common files for spine runtimes of different versions
1 lines • 53.7 kB
Source Map (JSON)
{"version":3,"file":"SpineBase.mjs","sources":["../src/SpineBase.ts"],"sourcesContent":["import { AttachmentType } from './core/AttachmentType';\nimport { TextureRegion } from './core/TextureRegion';\nimport { MathUtils } from './core/Utils';\nimport type { IAnimationState, IAnimationStateData } from './core/IAnimation';\nimport type { IAttachment, IClippingAttachment, IMeshAttachment, IRegionAttachment, ISkeleton, ISkeletonData, ISlot, IVertexAttachment } from './core/ISkeleton';\nimport { DRAW_MODES, Rectangle, Polygon, Transform, Texture, utils } from '@pixi/core';\nimport { Container, DisplayObject } from '@pixi/display';\nimport { Sprite } from '@pixi/sprite';\nimport { SimpleMesh } from '@pixi/mesh-extras';\nimport { Graphics } from '@pixi/graphics';\nimport { settings } from './settings';\nimport type { ISpineDebugRenderer } from './SpineDebugRenderer';\n\nconst tempRgb = [0, 0, 0];\n\n/**\n * @public\n */\nexport interface ISpineDisplayObject extends DisplayObject {\n region?: TextureRegion;\n attachment?: IAttachment;\n}\n\n/**\n * @public\n */\nexport class SpineSprite extends Sprite implements ISpineDisplayObject {\n region?: TextureRegion = null;\n attachment?: IAttachment = null;\n}\n\n/**\n * @public\n */\nexport class SpineMesh extends SimpleMesh implements ISpineDisplayObject {\n region?: TextureRegion = null;\n attachment?: IAttachment = null;\n\n constructor(texture: Texture, vertices?: Float32Array, uvs?: Float32Array, indices?: Uint16Array, drawMode?: number) {\n super(texture, vertices, uvs, indices, drawMode);\n }\n}\n\n/**\n * A class that enables the you to import and run your spine animations in pixi.\n * The Spine animation data needs to be loaded using either the Loader or a SpineLoader before it can be used by this class\n * See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source\n *\n * ```js\n * let spineAnimation = new spine(spineData);\n * ```\n *\n * @public\n * @class\n * @extends Container\n * @memberof spine\n * @param spineData {object} The spine data loaded from a spine atlas.\n */\nexport abstract class SpineBase<\n Skeleton extends ISkeleton,\n SkeletonData extends ISkeletonData,\n AnimationState extends IAnimationState,\n AnimationStateData extends IAnimationStateData\n >\n extends Container\n implements GlobalMixins.Spine\n{\n tintRgb: ArrayLike<number>;\n spineData: SkeletonData;\n skeleton: Skeleton;\n stateData: AnimationStateData;\n state: AnimationState;\n slotContainers: Array<Container>;\n tempClipContainers: Array<Container>;\n localDelayLimit: number;\n private _autoUpdate: boolean;\n protected _visible: boolean;\n private _debug: ISpineDebugRenderer;\n public get debug(): ISpineDebugRenderer {\n return this._debug;\n }\n public set debug(value: ISpineDebugRenderer) {\n if (value == this._debug) {\n // soft equality allows null == undefined\n return;\n }\n this._debug?.unregisterSpine(this);\n value?.registerSpine(this);\n this._debug = value;\n }\n\n abstract createSkeleton(spineData: ISkeletonData);\n\n constructor(spineData: SkeletonData) {\n super();\n\n if (!spineData) {\n throw new Error('The spineData param is required.');\n }\n\n if (typeof spineData === 'string') {\n throw new Error('spineData param cant be string. Please use spine.Spine.fromAtlas(\"YOUR_RESOURCE_NAME\") from now on.');\n }\n\n /**\n * The spineData object\n *\n * @member {object}\n */\n this.spineData = spineData;\n\n /**\n * A spine Skeleton object\n *\n * @member {object}\n */\n this.createSkeleton(spineData);\n\n /**\n * An array of containers\n *\n * @member {Container[]}\n */\n this.slotContainers = [];\n\n this.tempClipContainers = [];\n\n for (let i = 0, n = this.skeleton.slots.length; i < n; i++) {\n const slot = this.skeleton.slots[i];\n const attachment: any = slot.getAttachment();\n const slotContainer = this.newContainer();\n\n this.slotContainers.push(slotContainer);\n this.addChild(slotContainer);\n this.tempClipContainers.push(null);\n\n if (!attachment) {\n continue;\n }\n if (attachment.type === AttachmentType.Region) {\n const spriteName = attachment.name;\n const sprite = this.createSprite(slot, attachment as IRegionAttachment, spriteName);\n\n slot.currentSprite = sprite;\n slot.currentSpriteName = spriteName;\n slotContainer.addChild(sprite);\n } else if (attachment.type === AttachmentType.Mesh) {\n const mesh = this.createMesh(slot, attachment);\n\n slot.currentMesh = mesh;\n slot.currentMeshId = attachment.id;\n slot.currentMeshName = attachment.name;\n slotContainer.addChild(mesh);\n } else if (attachment.type === AttachmentType.Clipping) {\n this.createGraphics(slot, attachment);\n slotContainer.addChild(slot.clippingContainer);\n slotContainer.addChild(slot.currentGraphics);\n }\n }\n\n /**\n * The tint applied to all spine slots. This is a [r,g,b] value. A value of [1,1,1] will remove any tint effect.\n *\n * @member {number}\n * @memberof spine.Spine#\n */\n this.tintRgb = new Float32Array([1, 1, 1]);\n\n this.autoUpdate = true;\n this.visible = true;\n }\n\n /**\n * If this flag is set to true, the spine animation will be automatically updated every\n * time the object id drawn. The down side of this approach is that the delta time is\n * automatically calculated and you could miss out on cool effects like slow motion,\n * pause, skip ahead and the sorts. Most of these effects can be achieved even with\n * autoUpdate enabled but are harder to achieve.\n *\n * @member {boolean}\n * @memberof spine.Spine#\n * @default true\n */\n get autoUpdate(): boolean {\n return this._autoUpdate;\n }\n\n set autoUpdate(value: boolean) {\n if (value !== this._autoUpdate) {\n this._autoUpdate = value;\n this.updateTransform = value ? SpineBase.prototype.autoUpdateTransform : Container.prototype.updateTransform;\n }\n }\n\n /**\n * The tint applied to the spine object. This is a hex value. A value of 0xFFFFFF will remove any tint effect.\n *\n * @member {number}\n * @memberof spine.Spine#\n * @default 0xFFFFFF\n */\n get tint(): number {\n return utils.rgb2hex(this.tintRgb as any);\n }\n\n set tint(value: number) {\n this.tintRgb = utils.hex2rgb(value, this.tintRgb as any);\n }\n\n /**\n * Limit value for the update dt with Spine.globalDelayLimit\n * that can be overridden with localDelayLimit\n * @return {number} - Maximum processed dt value for the update\n */\n get delayLimit(): number {\n const limit = typeof this.localDelayLimit !== 'undefined' ? this.localDelayLimit : settings.GLOBAL_DELAY_LIMIT;\n\n // If limit is 0, this means there is no limit for the delay\n return limit || Number.MAX_VALUE;\n }\n\n /**\n * Update the spine skeleton and its animations by delta time (dt)\n *\n * @param dt {number} Delta time. Time by which the animation should be updated\n */\n update(dt: number) {\n // Limit delta value to avoid animation jumps\n const delayLimit = this.delayLimit;\n\n if (dt > delayLimit) dt = delayLimit;\n\n this.state.update(dt);\n this.state.apply(this.skeleton);\n\n // check we haven't been destroyed via a spine event callback in state update\n if (!this.skeleton) {\n return;\n }\n\n this.skeleton.updateWorldTransform();\n\n const slots = this.skeleton.slots;\n\n // in case pixi has double tint\n const globalClr = (this as any).color;\n let light: ArrayLike<number> = null;\n let dark: ArrayLike<number> = null;\n\n if (globalClr) {\n light = globalClr.light;\n dark = globalClr.dark;\n } else {\n light = this.tintRgb;\n }\n\n // let thack = false;\n\n for (let i = 0, n = slots.length; i < n; i++) {\n const slot = slots[i];\n const attachment = slot.getAttachment();\n const slotContainer = this.slotContainers[i];\n\n if (!attachment) {\n slotContainer.visible = false;\n continue;\n }\n\n let spriteColor: any = null;\n\n if (attachment.sequence) {\n attachment.sequence.apply(slot, attachment as any);\n }\n let region = (attachment as IRegionAttachment).region;\n\n const attColor = (attachment as any).color;\n\n switch (attachment != null && attachment.type) {\n case AttachmentType.Region:\n const transform = slotContainer.transform;\n\n transform.setFromMatrix(slot.bone.matrix);\n\n region = (attachment as IRegionAttachment).region;\n if (slot.currentMesh) {\n slot.currentMesh.visible = false;\n slot.currentMesh = null;\n slot.currentMeshId = undefined;\n slot.currentMeshName = undefined;\n }\n if (!region) {\n if (slot.currentSprite) {\n slot.currentSprite.renderable = false;\n }\n break;\n }\n if (!slot.currentSpriteName || slot.currentSpriteName !== attachment.name) {\n const spriteName = attachment.name;\n\n if (slot.currentSprite) {\n slot.currentSprite.visible = false;\n }\n slot.sprites = slot.sprites || {};\n if (slot.sprites[spriteName] !== undefined) {\n slot.sprites[spriteName].visible = true;\n } else {\n const sprite = this.createSprite(slot, attachment as IRegionAttachment, spriteName);\n\n slotContainer.addChild(sprite);\n }\n slot.currentSprite = slot.sprites[spriteName];\n slot.currentSpriteName = spriteName;\n\n // force sprite update when attachment name is same.\n // issues https://github.com/pixijs/pixi-spine/issues/318\n }\n slot.currentSprite.renderable = true;\n if (!slot.hackRegion) {\n this.setSpriteRegion(attachment as IRegionAttachment, slot.currentSprite, region);\n }\n if (slot.currentSprite.color) {\n // YAY! double - tint!\n spriteColor = slot.currentSprite.color;\n } else {\n tempRgb[0] = light[0] * slot.color.r * attColor.r;\n tempRgb[1] = light[1] * slot.color.g * attColor.g;\n tempRgb[2] = light[2] * slot.color.b * attColor.b;\n slot.currentSprite.tint = utils.rgb2hex(tempRgb);\n }\n slot.currentSprite.blendMode = slot.blendMode;\n break;\n\n case AttachmentType.Mesh:\n if (slot.currentSprite) {\n // TODO: refactor this thing, switch it on and off for container\n slot.currentSprite.visible = false;\n slot.currentSprite = null;\n slot.currentSpriteName = undefined;\n\n // TODO: refactor this shit\n const transform = new Transform();\n\n (transform as any)._parentID = -1;\n (transform as any)._worldID = (slotContainer.transform as any)._worldID;\n slotContainer.transform = transform;\n }\n if (!region) {\n if (slot.currentMesh) {\n slot.currentMesh.renderable = false;\n }\n break;\n }\n\n const id = (attachment as IVertexAttachment).id;\n\n if (slot.currentMeshId === undefined || slot.currentMeshId !== id) {\n const meshId = id;\n\n if (slot.currentMesh) {\n slot.currentMesh.visible = false;\n }\n\n slot.meshes = slot.meshes || {};\n\n if (slot.meshes[meshId] !== undefined) {\n slot.meshes[meshId].visible = true;\n } else {\n const mesh = this.createMesh(slot, attachment as IMeshAttachment);\n\n slotContainer.addChild(mesh);\n }\n\n slot.currentMesh = slot.meshes[meshId];\n slot.currentMeshName = attachment.name;\n slot.currentMeshId = meshId;\n }\n slot.currentMesh.renderable = true;\n (attachment as IVertexAttachment).computeWorldVerticesOld(slot, slot.currentMesh.vertices);\n if (slot.currentMesh.color) {\n // pixi-heaven\n spriteColor = slot.currentMesh.color;\n } else {\n tempRgb[0] = light[0] * slot.color.r * attColor.r;\n tempRgb[1] = light[1] * slot.color.g * attColor.g;\n tempRgb[2] = light[2] * slot.color.b * attColor.b;\n slot.currentMesh.tint = utils.rgb2hex(tempRgb);\n }\n slot.currentMesh.blendMode = slot.blendMode;\n if (!slot.hackRegion) {\n this.setMeshRegion(attachment as IMeshAttachment, slot.currentMesh, region);\n }\n break;\n case AttachmentType.Clipping:\n if (!slot.currentGraphics) {\n this.createGraphics(slot, attachment as IClippingAttachment);\n slotContainer.addChild(slot.clippingContainer);\n slotContainer.addChild(slot.currentGraphics);\n }\n this.updateGraphics(slot, attachment as IClippingAttachment);\n slotContainer.alpha = 1.0;\n slotContainer.visible = true;\n continue;\n default:\n slotContainer.visible = false;\n continue;\n }\n slotContainer.visible = true;\n\n // pixi has double tint\n if (spriteColor) {\n let r0 = slot.color.r * attColor.r;\n let g0 = slot.color.g * attColor.g;\n let b0 = slot.color.b * attColor.b;\n\n // YAY! double-tint!\n spriteColor.setLight(light[0] * r0 + dark[0] * (1.0 - r0), light[1] * g0 + dark[1] * (1.0 - g0), light[2] * b0 + dark[2] * (1.0 - b0));\n if (slot.darkColor) {\n r0 = slot.darkColor.r;\n g0 = slot.darkColor.g;\n b0 = slot.darkColor.b;\n } else {\n r0 = 0.0;\n g0 = 0.0;\n b0 = 0.0;\n }\n spriteColor.setDark(light[0] * r0 + dark[0] * (1 - r0), light[1] * g0 + dark[1] * (1 - g0), light[2] * b0 + dark[2] * (1 - b0));\n }\n\n slotContainer.alpha = slot.color.a;\n }\n\n // == this is clipping implementation ===\n // TODO: remove parent hacks when pixi masks allow it\n const drawOrder = this.skeleton.drawOrder;\n let clippingAttachment: IClippingAttachment = null;\n let clippingContainer: Container = null;\n\n for (let i = 0, n = drawOrder.length; i < n; i++) {\n const slot = slots[drawOrder[i].data.index];\n const slotContainer = this.slotContainers[drawOrder[i].data.index];\n\n if (!clippingContainer) {\n // Adding null check as it is possible for slotContainer.parent to be null in the event of a spine being disposed off in its loop callback\n if (slotContainer.parent !== null && slotContainer.parent !== this) {\n slotContainer.parent.removeChild(slotContainer);\n // silend add hack\n (slotContainer as any).parent = this;\n }\n }\n if (slot.currentGraphics && slot.getAttachment()) {\n clippingContainer = slot.clippingContainer;\n clippingAttachment = slot.getAttachment() as IClippingAttachment;\n clippingContainer.children.length = 0;\n this.children[i] = slotContainer;\n\n if (clippingAttachment.endSlot === slot.data) {\n clippingAttachment.endSlot = null;\n }\n } else if (clippingContainer) {\n let c = this.tempClipContainers[i];\n\n if (!c) {\n c = this.tempClipContainers[i] = this.newContainer();\n c.visible = false;\n }\n this.children[i] = c;\n\n // silent remove hack\n (slotContainer as any).parent = null;\n clippingContainer.addChild(slotContainer);\n if (clippingAttachment.endSlot == slot.data) {\n clippingContainer.renderable = true;\n clippingContainer = null;\n clippingAttachment = null;\n }\n } else {\n this.children[i] = slotContainer;\n }\n }\n\n // if you can debug, then debug!\n this._debug?.renderDebug(this);\n }\n\n private setSpriteRegion(attachment: IRegionAttachment, sprite: SpineSprite, region: TextureRegion) {\n // prevent setters calling when attachment and region is same\n if (sprite.attachment === attachment && sprite.region === region) {\n return;\n }\n\n sprite.region = region;\n sprite.attachment = attachment;\n\n sprite.texture = region.texture;\n sprite.rotation = attachment.rotation * MathUtils.degRad;\n sprite.position.x = attachment.x;\n sprite.position.y = attachment.y;\n sprite.alpha = attachment.color.a;\n\n if (!region.size) {\n sprite.scale.x = (attachment.scaleX * attachment.width) / region.originalWidth;\n sprite.scale.y = (-attachment.scaleY * attachment.height) / region.originalHeight;\n } else {\n // hacked!\n sprite.scale.x = region.size.width / region.originalWidth;\n sprite.scale.y = -region.size.height / region.originalHeight;\n }\n }\n\n private setMeshRegion(attachment: IMeshAttachment, mesh: SpineMesh, region: TextureRegion) {\n if (mesh.attachment === attachment && mesh.region === region) {\n return;\n }\n\n mesh.region = region;\n mesh.attachment = attachment;\n mesh.texture = region.texture;\n region.texture.updateUvs();\n mesh.uvBuffer.update(attachment.regionUVs);\n }\n\n protected lastTime: number;\n\n /**\n * When autoupdate is set to yes this function is used as pixi's updateTransform function\n *\n * @private\n */\n autoUpdateTransform() {\n if (settings.GLOBAL_AUTO_UPDATE) {\n this.lastTime = this.lastTime || Date.now();\n const timeDelta = (Date.now() - this.lastTime) * 0.001;\n\n this.lastTime = Date.now();\n this.update(timeDelta);\n } else {\n this.lastTime = 0;\n }\n\n Container.prototype.updateTransform.call(this);\n }\n\n /**\n * Create a new sprite to be used with core.RegionAttachment\n *\n * @param slot {spine.Slot} The slot to which the attachment is parented\n * @param attachment {spine.RegionAttachment} The attachment that the sprite will represent\n * @private\n */\n createSprite(slot: ISlot, attachment: IRegionAttachment, defName: string) {\n let region = attachment.region;\n\n if (slot.hackAttachment === attachment) {\n region = slot.hackRegion;\n }\n const texture = region ? region.texture : null;\n const sprite = this.newSprite(texture);\n\n sprite.anchor.set(0.5);\n if (region) {\n this.setSpriteRegion(attachment, sprite, attachment.region);\n }\n\n slot.sprites = slot.sprites || {};\n slot.sprites[defName] = sprite;\n\n return sprite;\n }\n\n /**\n * Creates a Strip from the spine data\n * @param slot {spine.Slot} The slot to which the attachment is parented\n * @param attachment {spine.RegionAttachment} The attachment that the sprite will represent\n * @private\n */\n createMesh(slot: ISlot, attachment: IMeshAttachment) {\n if (!attachment.region && attachment.sequence) {\n attachment.sequence.apply(slot, attachment as any);\n }\n let region = attachment.region;\n\n if (slot.hackAttachment === attachment) {\n region = slot.hackRegion;\n slot.hackAttachment = null;\n slot.hackRegion = null;\n }\n const strip = this.newMesh(\n region ? region.texture : null,\n new Float32Array(attachment.regionUVs.length),\n attachment.regionUVs,\n new Uint16Array(attachment.triangles),\n DRAW_MODES.TRIANGLES\n );\n\n if (typeof (strip as any)._canvasPadding !== 'undefined') {\n (strip as any)._canvasPadding = 1.5;\n }\n\n strip.alpha = attachment.color.a;\n\n strip.region = attachment.region;\n if (region) {\n this.setMeshRegion(attachment, strip, region);\n }\n\n slot.meshes = slot.meshes || {};\n slot.meshes[attachment.id] = strip;\n\n return strip;\n }\n\n static clippingPolygon: Array<number> = [];\n\n // @ts-ignore\n createGraphics(slot: ISlot, clip: IClippingAttachment) {\n const graphics = this.newGraphics();\n const poly = new Polygon([]);\n\n graphics.clear();\n graphics.beginFill(0xffffff, 1);\n graphics.drawPolygon(poly as any);\n graphics.renderable = false;\n slot.currentGraphics = graphics;\n slot.clippingContainer = this.newContainer();\n slot.clippingContainer.mask = slot.currentGraphics;\n\n return graphics;\n }\n\n updateGraphics(slot: ISlot, clip: IClippingAttachment) {\n const geom = slot.currentGraphics.geometry;\n const vertices = (geom.graphicsData[0].shape as Polygon).points;\n const n = clip.worldVerticesLength;\n\n vertices.length = n;\n clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);\n geom.invalidate();\n }\n\n /**\n * Changes texture in attachment in specific slot.\n *\n * PIXI runtime feature, it was made to satisfy our users.\n *\n * @param slotIndex {number}\n * @param [texture = null] {PIXI.Texture} If null, take default (original) texture\n * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there\n * @returns {boolean} Success flag\n */\n hackTextureBySlotIndex(slotIndex: number, texture: Texture = null, size: Rectangle = null) {\n const slot = this.skeleton.slots[slotIndex];\n\n if (!slot) {\n return false;\n }\n const attachment: any = slot.getAttachment();\n let region: TextureRegion = attachment.region;\n\n if (texture) {\n region = new TextureRegion();\n region.texture = texture;\n region.size = size;\n slot.hackRegion = region;\n slot.hackAttachment = attachment;\n } else {\n slot.hackRegion = null;\n slot.hackAttachment = null;\n }\n if (slot.currentSprite) {\n this.setSpriteRegion(attachment, slot.currentSprite, region);\n } else if (slot.currentMesh) {\n this.setMeshRegion(attachment, slot.currentMesh, region);\n }\n\n return true;\n }\n\n /**\n * Changes texture in attachment in specific slot.\n *\n * PIXI runtime feature, it was made to satisfy our users.\n *\n * @param slotName {string}\n * @param [texture = null] {PIXI.Texture} If null, take default (original) texture\n * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there\n * @returns {boolean} Success flag\n */\n hackTextureBySlotName(slotName: string, texture: Texture = null, size: Rectangle = null) {\n const index = this.skeleton.findSlotIndex(slotName);\n\n if (index == -1) {\n return false;\n }\n\n return this.hackTextureBySlotIndex(index, texture, size);\n }\n\n /**\n * Changes texture of an attachment\n *\n * PIXI runtime feature, it was made to satisfy our users.\n *\n * @param slotName {string}\n * @param attachmentName {string}\n * @param [texture = null] {PIXI.Texture} If null, take default (original) texture\n * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there\n * @returns {boolean} Success flag\n */\n hackTextureAttachment(slotName: string, attachmentName: string, texture, size: Rectangle = null) {\n // changes the texture of an attachment at the skeleton level\n const slotIndex = this.skeleton.findSlotIndex(slotName);\n const attachment: any = this.skeleton.getAttachmentByName(slotName, attachmentName);\n\n attachment.region.texture = texture;\n\n const slot = this.skeleton.slots[slotIndex];\n\n if (!slot) {\n return false;\n }\n\n // gets the currently active attachment in this slot\n const currentAttachment: any = slot.getAttachment();\n\n if (attachmentName === currentAttachment.name) {\n // if the attachment we are changing is currently active, change the the live texture\n let region: TextureRegion = attachment.region;\n\n if (texture) {\n region = new TextureRegion();\n region.texture = texture;\n region.size = size;\n slot.hackRegion = region;\n slot.hackAttachment = currentAttachment;\n } else {\n slot.hackRegion = null;\n slot.hackAttachment = null;\n }\n if (slot.currentSprite && slot.currentSprite.region != region) {\n this.setSpriteRegion(currentAttachment, slot.currentSprite, region);\n slot.currentSprite.region = region;\n } else if (slot.currentMesh && slot.currentMesh.region != region) {\n this.setMeshRegion(currentAttachment, slot.currentMesh, region);\n }\n\n return true;\n }\n\n return false;\n }\n\n // those methods can be overriden to spawn different classes\n newContainer() {\n return new Container();\n }\n\n newSprite(tex: Texture) {\n return new SpineSprite(tex);\n }\n\n newGraphics() {\n return new Graphics();\n }\n\n newMesh(texture: Texture, vertices?: Float32Array, uvs?: Float32Array, indices?: Uint16Array, drawMode?: number) {\n return new SpineMesh(texture, vertices, uvs, indices, drawMode);\n }\n\n transformHack() {\n return 1;\n }\n\n /**\n * Hack for pixi-display and pixi-lights. Every attachment name ending with a suffix will be added to different layer\n * @param nameSuffix\n * @param group\n * @param outGroup\n */\n hackAttachmentGroups(nameSuffix: string, group: any, outGroup: any) {\n if (!nameSuffix) {\n return undefined;\n }\n const list_d = [];\n const list_n = [];\n\n for (let i = 0, len = this.skeleton.slots.length; i < len; i++) {\n const slot = this.skeleton.slots[i];\n const name = slot.currentSpriteName || slot.currentMeshName || '';\n const target = slot.currentSprite || slot.currentMesh;\n\n if (name.endsWith(nameSuffix)) {\n target.parentGroup = group;\n list_n.push(target);\n } else if (outGroup && target) {\n target.parentGroup = outGroup;\n list_d.push(target);\n }\n }\n\n return [list_d, list_n];\n }\n\n destroy(options?: any): void {\n this.debug = null; // setter will do the cleanup\n\n for (let i = 0, n = this.skeleton.slots.length; i < n; i++) {\n const slot = this.skeleton.slots[i];\n\n for (const name in slot.meshes) {\n slot.meshes[name].destroy(options);\n }\n slot.meshes = null;\n\n for (const name in slot.sprites) {\n slot.sprites[name].destroy(options);\n }\n slot.sprites = null;\n }\n\n for (let i = 0, n = this.slotContainers.length; i < n; i++) {\n this.slotContainers[i].destroy(options);\n }\n this.spineData = null;\n this.skeleton = null;\n this.slotContainers = null;\n this.stateData = null;\n this.state = null;\n this.tempClipContainers = null;\n\n super.destroy(options);\n }\n}\n\n/**\n * The visibility of the spine object. If false the object will not be drawn,\n * the updateTransform function will not be called, and the spine will not be automatically updated.\n *\n * @member {boolean}\n * @memberof spine.Spine#\n * @default true\n */\nObject.defineProperty(SpineBase.prototype, 'visible', {\n get() {\n return this._visible;\n },\n set(value: boolean) {\n if (value !== this._visible) {\n this._visible = value;\n if (value) {\n this.lastTime = 0;\n }\n }\n },\n});\n"],"names":["transform"],"mappings":"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