{"version":3,"file":"SpineDebugRenderer.mjs","sources":["../src/SpineDebugRenderer.ts"],"sourcesContent":["import { Container } from '@pixi/display';\nimport { Graphics } from '@pixi/graphics';\nimport type { IAnimationState, IAnimationStateData } from './core/IAnimation';\nimport type { IClippingAttachment, IMeshAttachment, IRegionAttachment, ISkeleton, ISkeletonData, IVertexAttachment } from './core/ISkeleton';\nimport type { SpineBase } from './SpineBase';\nimport { AttachmentType } from './core/AttachmentType';\nimport { SkeletonBoundsBase } from './core/SkeletonBoundsBase';\n\n/**\n * Make a class that extends from this interface to create your own debug renderer.\n * @public\n */\nexport interface ISpineDebugRenderer {\n    /**\n     * This will be called every frame, after the spine has been updated.\n     */\n    renderDebug(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n\n    /**\n     *  This is called when the `spine.debug` object is set to null or when the spine is destroyed.\n     */\n    unregisterSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n\n    /**\n     * This is called when the `spine.debug` object is set to a new instance of a debug renderer.\n     */\n    registerSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n}\n\ntype DebugDisplayObjects = {\n    bones: Container;\n    skeletonXY: Graphics;\n    regionAttachmentsShape: Graphics;\n    meshTrianglesLine: Graphics;\n    meshHullLine: Graphics;\n    clippingPolygon: Graphics;\n    boundingBoxesRect: Graphics;\n    boundingBoxesCircle: Graphics;\n    boundingBoxesPolygon: Graphics;\n    pathsCurve: Graphics;\n    pathsLine: Graphics;\n    parentDebugContainer: Container;\n};\n\n/**\n * This is a debug renderer that uses PixiJS Graphics under the hood.\n * @public\n */\nexport class SpineDebugRenderer implements ISpineDebugRenderer {\n    private registeredSpines: Map<SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, DebugDisplayObjects> = new Map();\n\n    public drawDebug = true;\n    public drawMeshHull = true;\n    public drawMeshTriangles = true;\n    public drawBones = true;\n    public drawPaths = true;\n    public drawBoundingBoxes = true;\n    public drawClipping = true;\n    public drawRegionAttachments = true;\n\n    public lineWidth = 1;\n    public regionAttachmentsColor = 0x0078ff;\n    public meshHullColor = 0x0078ff;\n    public meshTrianglesColor = 0xffcc00;\n    public clippingPolygonColor = 0xff00ff;\n    public boundingBoxesRectColor = 0x00ff00;\n    public boundingBoxesPolygonColor = 0x00ff00;\n    public boundingBoxesCircleColor = 0x00ff00;\n    public pathsCurveColor = 0xff0000;\n    public pathsLineColor = 0xff00ff;\n    public skeletonXYColor = 0xff0000;\n    public bonesColor = 0x00eecc;\n\n    /**\n     * The debug is attached by force to each spine object. So we need to create it inside the spine when we get the first update\n     */\n    public registerSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>) {\n        if (this.registeredSpines.has(spine)) {\n            console.warn('SpineDebugRenderer.registerSpine() - this spine is already registered!', spine);\n        }\n        const debugDisplayObjects = {\n            parentDebugContainer: new Container(),\n            bones: new Container(),\n            skeletonXY: new Graphics(),\n            regionAttachmentsShape: new Graphics(),\n            meshTrianglesLine: new Graphics(),\n            meshHullLine: new Graphics(),\n            clippingPolygon: new Graphics(),\n            boundingBoxesRect: new Graphics(),\n            boundingBoxesCircle: new Graphics(),\n            boundingBoxesPolygon: new Graphics(),\n            pathsCurve: new Graphics(),\n            pathsLine: new Graphics(),\n        };\n\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.bones);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.skeletonXY);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.regionAttachmentsShape);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshTrianglesLine);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshHullLine);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.clippingPolygon);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesRect);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesCircle);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesPolygon);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsCurve);\n        debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsLine);\n\n        spine.addChild(debugDisplayObjects.parentDebugContainer);\n\n        this.registeredSpines.set(spine, debugDisplayObjects);\n    }\n    public renderDebug(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void {\n        if (!this.registeredSpines.has(spine)) {\n            // This should never happen. Spines are registered when you assign spine.debug\n            this.registerSpine(spine);\n        }\n\n        const debugDisplayObjects = this.registeredSpines.get(spine);\n\n        debugDisplayObjects.skeletonXY.clear();\n        debugDisplayObjects.regionAttachmentsShape.clear();\n        debugDisplayObjects.meshTrianglesLine.clear();\n        debugDisplayObjects.meshHullLine.clear();\n        debugDisplayObjects.clippingPolygon.clear();\n        debugDisplayObjects.boundingBoxesRect.clear();\n        debugDisplayObjects.boundingBoxesCircle.clear();\n        debugDisplayObjects.boundingBoxesPolygon.clear();\n        debugDisplayObjects.pathsCurve.clear();\n        debugDisplayObjects.pathsLine.clear();\n\n        for (let len = debugDisplayObjects.bones.children.length; len > 0; len--) {\n            debugDisplayObjects.bones.children[len - 1].destroy({ children: true, texture: true, baseTexture: true });\n        }\n\n        const scale = spine.scale.x || spine.scale.y || 1;\n        const lineWidth = this.lineWidth / scale;\n\n        if (this.drawBones) {\n            this.drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale);\n        }\n\n        if (this.drawPaths) {\n            this.drawPathsFunc(spine, debugDisplayObjects, lineWidth);\n        }\n\n        if (this.drawBoundingBoxes) {\n            this.drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth);\n        }\n\n        if (this.drawClipping) {\n            this.drawClippingFunc(spine, debugDisplayObjects, lineWidth);\n        }\n\n        if (this.drawMeshHull || this.drawMeshTriangles) {\n            this.drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth);\n        }\n\n        if (this.drawRegionAttachments) {\n            this.drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth);\n        }\n    }\n\n    private drawBonesFunc(\n        spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n        debugDisplayObjects: DebugDisplayObjects,\n        lineWidth: number,\n        scale: number\n    ): void {\n        const skeleton = spine.skeleton;\n        const skeletonX = skeleton.x;\n        const skeletonY = skeleton.y;\n        const bones = skeleton.bones;\n\n        debugDisplayObjects.skeletonXY.lineStyle(lineWidth, this.skeletonXYColor, 1);\n\n        for (let i = 0, len = bones.length; i < len; i++) {\n            const bone = bones[i];\n            const boneLen = bone.data.length;\n            const starX = skeletonX + bone.matrix.tx;\n            const starY = skeletonY + bone.matrix.ty;\n            const endX = skeletonX + boneLen * bone.matrix.a + bone.matrix.tx;\n            const endY = skeletonY + boneLen * bone.matrix.b + bone.matrix.ty;\n\n            if (bone.data.name === 'root' || bone.data.parent === null) {\n                continue;\n            }\n\n            // Triangle calculation formula\n            // area: A=sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))/4\n            // alpha: alpha=acos((pow(b, 2)+pow(c, 2)-pow(a, 2))/(2*b*c))\n            // beta: beta=acos((pow(a, 2)+pow(c, 2)-pow(b, 2))/(2*a*c))\n            // gamma: gamma=acos((pow(a, 2)+pow(b, 2)-pow(c, 2))/(2*a*b))\n\n            const w = Math.abs(starX - endX);\n            const h = Math.abs(starY - endY);\n            // a = w, // side length a\n            const a2 = Math.pow(w, 2); // square root of side length a\n            const b = h; // side length b\n            const b2 = Math.pow(h, 2); // square root of side length b\n            const c = Math.sqrt(a2 + b2); // side length c\n            const c2 = Math.pow(c, 2); // square root of side length c\n            const rad = Math.PI / 180;\n            // A = Math.acos([a2 + c2 - b2] / [2 * a * c]) || 0, // Angle A\n            // C = Math.acos([a2 + b2 - c2] / [2 * a * b]) || 0, // C angle\n            const B = Math.acos((c2 + b2 - a2) / (2 * b * c)) || 0; // angle of corner B\n\n            if (c === 0) {\n                continue;\n            }\n\n            const gp = new Graphics();\n\n            debugDisplayObjects.bones.addChild(gp);\n\n            // draw bone\n            const refRation = c / 50 / scale;\n\n            gp.beginFill(this.bonesColor, 1);\n            gp.drawPolygon(0, 0, 0 - refRation, c - refRation * 3, 0, c - refRation, 0 + refRation, c - refRation * 3);\n            gp.endFill();\n            gp.x = starX;\n            gp.y = starY;\n            gp.pivot.y = c;\n\n            // Calculate bone rotation angle\n            let rotation = 0;\n\n            if (starX < endX && starY < endY) {\n                // bottom right\n                rotation = -B + 180 * rad;\n            } else if (starX > endX && starY < endY) {\n                // bottom left\n                rotation = 180 * rad + B;\n            } else if (starX > endX && starY > endY) {\n                // top left\n                rotation = -B;\n            } else if (starX < endX && starY > endY) {\n                // bottom left\n                rotation = B;\n            } else if (starY === endY && starX < endX) {\n                // To the right\n                rotation = 90 * rad;\n            } else if (starY === endY && starX > endX) {\n                // go left\n                rotation = -90 * rad;\n            } else if (starX === endX && starY < endY) {\n                // down\n                rotation = 180 * rad;\n            } else if (starX === endX && starY > endY) {\n                // up\n                rotation = 0;\n            }\n            gp.rotation = rotation;\n\n            // Draw the starting rotation point of the bone\n            gp.lineStyle(lineWidth + refRation / 2.4, this.bonesColor, 1);\n            gp.beginFill(0x000000, 0.6);\n            gp.drawCircle(0, c, refRation * 1.2);\n            gp.endFill();\n        }\n\n        // Draw the skeleton starting point \"X\" form\n        const startDotSize = lineWidth * 3;\n\n        debugDisplayObjects.skeletonXY.moveTo(skeletonX - startDotSize, skeletonY - startDotSize);\n        debugDisplayObjects.skeletonXY.lineTo(skeletonX + startDotSize, skeletonY + startDotSize);\n        debugDisplayObjects.skeletonXY.moveTo(skeletonX + startDotSize, skeletonY - startDotSize);\n        debugDisplayObjects.skeletonXY.lineTo(skeletonX - startDotSize, skeletonY + startDotSize);\n    }\n\n    private drawRegionAttachmentsFunc(\n        spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n        debugDisplayObjects: DebugDisplayObjects,\n        lineWidth: number\n    ): void {\n        const skeleton = spine.skeleton;\n        const slots = skeleton.slots;\n\n        debugDisplayObjects.regionAttachmentsShape.lineStyle(lineWidth, this.regionAttachmentsColor, 1);\n\n        for (let i = 0, len = slots.length; i < len; i++) {\n            const slot = slots[i];\n            const attachment = slot.getAttachment();\n\n            if (attachment == null || attachment.type !== AttachmentType.Region) {\n                continue;\n            }\n\n            const regionAttachment = attachment as IRegionAttachment & {\n                computeWorldVertices: (slot: unknown, worldVertices: unknown, offset: unknown, stride: unknown) => void;\n                updateOffset?: () => void;\n            };\n\n            const vertices = new Float32Array(8);\n\n            if (regionAttachment.updateOffset) regionAttachment.updateOffset(); // We don't need this on all versions\n\n            regionAttachment.computeWorldVertices(slot, vertices, 0, 2);\n            debugDisplayObjects.regionAttachmentsShape.drawPolygon(Array.from(vertices.slice(0, 8)));\n        }\n    }\n\n    private drawMeshHullAndMeshTriangles(\n        spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n        debugDisplayObjects: DebugDisplayObjects,\n        lineWidth: number\n    ): void {\n        const skeleton = spine.skeleton;\n        const slots = skeleton.slots;\n\n        debugDisplayObjects.meshHullLine.lineStyle(lineWidth, this.meshHullColor, 1);\n        debugDisplayObjects.meshTrianglesLine.lineStyle(lineWidth, this.meshTrianglesColor, 1);\n\n        for (let i = 0, len = slots.length; i < len; i++) {\n            const slot = slots[i];\n\n            if (!slot.bone.active) {\n                continue;\n            }\n            const attachment = slot.getAttachment();\n\n            if (attachment == null || attachment.type !== AttachmentType.Mesh) {\n                continue;\n            }\n\n            const meshAttachment: IMeshAttachment = attachment as IMeshAttachment;\n\n            const vertices = new Float32Array(meshAttachment.worldVerticesLength);\n            const triangles = meshAttachment.triangles;\n            let hullLength = meshAttachment.hullLength;\n\n            meshAttachment.computeWorldVertices(slot, 0, meshAttachment.worldVerticesLength, vertices, 0, 2);\n            // draw the skinned mesh (triangle)\n            if (this.drawMeshTriangles) {\n                for (let i = 0, len = triangles.length; i < len; i += 3) {\n                    const v1 = triangles[i] * 2;\n                    const v2 = triangles[i + 1] * 2;\n                    const v3 = triangles[i + 2] * 2;\n\n                    debugDisplayObjects.meshTrianglesLine.moveTo(vertices[v1], vertices[v1 + 1]);\n                    debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v2], vertices[v2 + 1]);\n                    debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v3], vertices[v3 + 1]);\n                }\n            }\n\n            // draw skin border\n            if (this.drawMeshHull && hullLength > 0) {\n                hullLength = (hullLength >> 1) * 2;\n                let lastX = vertices[hullLength - 2];\n                let lastY = vertices[hullLength - 1];\n\n                for (let i = 0, len = hullLength; i < len; i += 2) {\n                    const x = vertices[i];\n                    const y = vertices[i + 1];\n\n                    debugDisplayObjects.meshHullLine.moveTo(x, y);\n                    debugDisplayObjects.meshHullLine.lineTo(lastX, lastY);\n                    lastX = x;\n                    lastY = y;\n                }\n            }\n        }\n    }\n\n    private drawClippingFunc(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, debugDisplayObjects: DebugDisplayObjects, lineWidth: number): void {\n        const skeleton = spine.skeleton;\n        const slots = skeleton.slots;\n\n        debugDisplayObjects.clippingPolygon.lineStyle(lineWidth, this.clippingPolygonColor, 1);\n        for (let i = 0, len = slots.length; i < len; i++) {\n            const slot = slots[i];\n\n            if (!slot.bone.active) {\n                continue;\n            }\n            const attachment = slot.getAttachment();\n\n            if (attachment == null || attachment.type !== AttachmentType.Clipping) {\n                continue;\n            }\n\n            const clippingAttachment: IClippingAttachment = attachment as IClippingAttachment;\n\n            const nn = clippingAttachment.worldVerticesLength;\n            const world = new Float32Array(nn);\n\n            clippingAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);\n            debugDisplayObjects.clippingPolygon.drawPolygon(Array.from(world));\n        }\n    }\n\n    private drawBoundingBoxesFunc(\n        spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n        debugDisplayObjects: DebugDisplayObjects,\n        lineWidth: number\n    ): void {\n        // draw the total outline of the bounding box\n        debugDisplayObjects.boundingBoxesRect.lineStyle(lineWidth, this.boundingBoxesRectColor, 5);\n\n        const bounds = new SkeletonBoundsBase();\n\n        bounds.update(spine.skeleton, true);\n        debugDisplayObjects.boundingBoxesRect.drawRect(bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight());\n\n        const polygons = bounds.polygons;\n        const drawPolygon = (polygonVertices: ArrayLike<number>, _offset: unknown, count: number): void => {\n            debugDisplayObjects.boundingBoxesPolygon.lineStyle(lineWidth, this.boundingBoxesPolygonColor, 1);\n            debugDisplayObjects.boundingBoxesPolygon.beginFill(this.boundingBoxesPolygonColor, 0.1);\n\n            if (count < 3) {\n                throw new Error('Polygon must contain at least 3 vertices');\n            }\n            const paths = [];\n            const dotSize = lineWidth * 2;\n\n            for (let i = 0, len = polygonVertices.length; i < len; i += 2) {\n                const x1 = polygonVertices[i];\n                const y1 = polygonVertices[i + 1];\n\n                // draw the bounding box node\n                debugDisplayObjects.boundingBoxesCircle.lineStyle(0);\n                debugDisplayObjects.boundingBoxesCircle.beginFill(this.boundingBoxesCircleColor);\n                debugDisplayObjects.boundingBoxesCircle.drawCircle(x1, y1, dotSize);\n                debugDisplayObjects.boundingBoxesCircle.endFill();\n\n                paths.push(x1, y1);\n            }\n\n            // draw the bounding box area\n            debugDisplayObjects.boundingBoxesPolygon.drawPolygon(paths);\n            debugDisplayObjects.boundingBoxesPolygon.endFill();\n        };\n\n        for (let i = 0, len = polygons.length; i < len; i++) {\n            const polygon = polygons[i];\n\n            drawPolygon(polygon, 0, polygon.length);\n        }\n    }\n\n    private drawPathsFunc(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, debugDisplayObjects: DebugDisplayObjects, lineWidth: number): void {\n        const skeleton = spine.skeleton;\n        const slots = skeleton.slots;\n\n        debugDisplayObjects.pathsCurve.lineStyle(lineWidth, this.pathsCurveColor, 1);\n        debugDisplayObjects.pathsLine.lineStyle(lineWidth, this.pathsLineColor, 1);\n\n        for (let i = 0, len = slots.length; i < len; i++) {\n            const slot = slots[i];\n\n            if (!slot.bone.active) {\n                continue;\n            }\n            const attachment = slot.getAttachment();\n\n            if (attachment == null || attachment.type !== AttachmentType.Path) {\n                continue;\n            }\n\n            const pathAttachment = attachment as IVertexAttachment & { closed: boolean };\n            let nn = pathAttachment.worldVerticesLength;\n            const world = new Float32Array(nn);\n\n            pathAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);\n            let x1 = world[2];\n            let y1 = world[3];\n            let x2 = 0;\n            let y2 = 0;\n\n            if (pathAttachment.closed) {\n                const cx1 = world[0];\n                const cy1 = world[1];\n                const cx2 = world[nn - 2];\n                const cy2 = world[nn - 1];\n\n                x2 = world[nn - 4];\n                y2 = world[nn - 3];\n\n                // curve\n                debugDisplayObjects.pathsCurve.moveTo(x1, y1);\n                debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);\n\n                // handle\n                debugDisplayObjects.pathsLine.moveTo(x1, y1);\n                debugDisplayObjects.pathsLine.lineTo(cx1, cy1);\n                debugDisplayObjects.pathsLine.moveTo(x2, y2);\n                debugDisplayObjects.pathsLine.lineTo(cx2, cy2);\n            }\n            nn -= 4;\n            for (let ii = 4; ii < nn; ii += 6) {\n                const cx1 = world[ii];\n                const cy1 = world[ii + 1];\n                const cx2 = world[ii + 2];\n                const cy2 = world[ii + 3];\n\n                x2 = world[ii + 4];\n                y2 = world[ii + 5];\n                // curve\n                debugDisplayObjects.pathsCurve.moveTo(x1, y1);\n                debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);\n\n                // handle\n                debugDisplayObjects.pathsLine.moveTo(x1, y1);\n                debugDisplayObjects.pathsLine.lineTo(cx1, cy1);\n                debugDisplayObjects.pathsLine.moveTo(x2, y2);\n                debugDisplayObjects.pathsLine.lineTo(cx2, cy2);\n                x1 = x2;\n                y1 = y2;\n            }\n        }\n    }\n\n    public unregisterSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void {\n        if (!this.registeredSpines.has(spine)) {\n            console.warn(\"SpineDebugRenderer.unregisterSpine() - spine is not registered, can't unregister!\", spine);\n        }\n        const debugDisplayObjects = this.registeredSpines.get(spine);\n\n        debugDisplayObjects.parentDebugContainer.destroy({ baseTexture: true, children: true, texture: true });\n        this.registeredSpines.delete(spine);\n    }\n}\n"],"names":["i","len"],"mappings":"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"}