{"version":3,"file":"IkConstraint.mjs","sources":["../../src/core/IkConstraint.ts"],"sourcesContent":["import type { Updatable } from './Updatable';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { Bone } from './Bone';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils, settings, TransformMode } from '@pixi-spine/base';\n\n/** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of\n * the last bone is as close to the target bone as possible.\n *\n * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide.\n * @public\n * */\nexport class IkConstraint implements Updatable {\n    /** The IK constraint's setup pose data. */\n    data: IkConstraintData;\n\n    /** The bones that will be modified by this IK constraint. */\n    bones: Array<Bone>;\n\n    /** The bone that is the IK target. */\n    target: Bone;\n\n    /** Controls the bend direction of the IK bones, either 1 or -1. */\n    bendDirection = 0;\n\n    /** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */\n    compress = false;\n\n    /** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained\n     * and the parent bone has local nonuniform scale, stretch is not applied. */\n    stretch = false;\n\n    /** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */\n    mix = 1;\n\n    /** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */\n    softness = 0;\n    active = false;\n\n    constructor(data: IkConstraintData, skeleton: Skeleton) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.mix = data.mix;\n        this.softness = data.softness;\n        this.bendDirection = data.bendDirection;\n        this.compress = data.compress;\n        this.stretch = data.stretch;\n\n        this.bones = new Array<Bone>();\n        for (let i = 0; i < data.bones.length; i++) {\n            const bone = skeleton.findBone(data.bones[i].name);\n\n            if (!bone) throw new Error(`Couldn't find bone ${data.bones[i].name}`);\n            this.bones.push(bone);\n        }\n        const target = skeleton.findBone(data.target.name);\n\n        if (!target) throw new Error(`Couldn't find bone ${data.target.name}`);\n        this.target = target;\n    }\n\n    isActive() {\n        return this.active;\n    }\n\n    update() {\n        if (this.mix == 0) return;\n        const target = this.target;\n        const bones = this.bones;\n\n        switch (bones.length) {\n            case 1:\n                this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);\n                break;\n            case 2:\n                this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix);\n                break;\n        }\n    }\n\n    /** Applies 1 bone IK. The target is specified in the world coordinate system. */\n    apply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number) {\n        const p = bone.parent.matrix;\n\n        if (!p) throw new Error('IK bone must have parent.');\n        const pa = p.a;\n        let pb = p.c;\n        const pc = p.b;\n        let pd = p.d;\n        let rotationIK = -bone.ashearX - bone.arotation;\n        let tx = 0;\n        let ty = 0;\n\n        const skelX = bone.skeleton.scaleX;\n        const skelY = settings.yDown ? -bone.skeleton.scaleY : bone.skeleton.scaleY;\n\n        switch (bone.data.transformMode) {\n            case TransformMode.OnlyTranslation:\n                tx = (targetX - bone.worldX) * MathUtils.signum(skelX);\n                ty = (targetY - bone.worldY) * MathUtils.signum(skelY);\n                break;\n            case TransformMode.NoRotationOrReflection:\n                const s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);\n                const sa = pa / skelX;\n                const sc = pc / skelY;\n\n                pb = -sc * s * skelX;\n                pd = sa * s * skelY;\n                rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;\n            // Fall through\n            default:\n                const x = targetX - p.tx;\n                const y = targetY - p.ty;\n                const d = pa * pd - pb * pc;\n\n                tx = (x * pd - y * pb) / d - bone.ax;\n                ty = (y * pa - x * pc) / d - bone.ay;\n        }\n        rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;\n        if (bone.ascaleX < 0) rotationIK += 180;\n        if (rotationIK > 180) rotationIK -= 360;\n        else if (rotationIK < -180) rotationIK += 360;\n        let sx = bone.ascaleX;\n        let sy = bone.ascaleY;\n\n        if (compress || stretch) {\n            switch (bone.data.transformMode) {\n                case TransformMode.NoScale:\n                case TransformMode.NoScaleOrReflection:\n                    tx = targetX - bone.worldX;\n                    ty = targetY - bone.worldY;\n            }\n            const b = bone.data.length * sx;\n            const dd = Math.sqrt(tx * tx + ty * ty);\n\n            if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) {\n                const s = (dd / b - 1) * alpha + 1;\n\n                sx *= s;\n                if (uniform) sy *= s;\n            }\n        }\n        bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);\n    }\n\n    /** Applies 2 bone IK. The target is specified in the world coordinate system.\n     * @param child A direct descendant of the parent bone. */\n    apply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDir: number, stretch: boolean, uniform: boolean, softness: number, alpha: number) {\n        const px = parent.ax;\n        const py = parent.ay;\n        let psx = parent.ascaleX;\n        let psy = parent.ascaleY;\n        let sx = psx;\n        let sy = psy;\n        let csx = child.ascaleX;\n        const pmat = parent.matrix;\n        let os1 = 0;\n        let os2 = 0;\n        let s2 = 0;\n\n        if (psx < 0) {\n            psx = -psx;\n            os1 = 180;\n            s2 = -1;\n        } else {\n            os1 = 0;\n            s2 = 1;\n        }\n        if (psy < 0) {\n            psy = -psy;\n            s2 = -s2;\n        }\n        if (csx < 0) {\n            csx = -csx;\n            os2 = 180;\n        } else os2 = 0;\n        const cx = child.ax;\n        let cy = 0;\n        let cwx = 0;\n        let cwy = 0;\n        let a = pmat.a;\n        let b = pmat.c;\n        let c = pmat.b;\n        let d = pmat.d;\n        const u = Math.abs(psx - psy) <= 0.0001;\n\n        if (!u || stretch) {\n            cy = 0;\n            cwx = a * cx + pmat.tx;\n            cwy = c * cx + pmat.ty;\n        } else {\n            cy = child.ay;\n            cwx = a * cx + b * cy + pmat.tx;\n            cwy = c * cx + d * cy + pmat.ty;\n        }\n        const pp = parent.parent.matrix;\n\n        if (!pp) throw new Error('IK parent must itself have a parent.');\n        a = pp.a;\n        b = pp.c;\n        c = pp.b;\n        d = pp.d;\n        const id = 1 / (a * d - b * c);\n        let x = cwx - pp.tx;\n        let y = cwy - pp.ty;\n        const dx = (x * d - y * b) * id - px;\n        const dy = (y * a - x * c) * id - py;\n        const l1 = Math.sqrt(dx * dx + dy * dy);\n        let l2 = child.data.length * csx;\n        let a1;\n        let a2;\n\n        if (l1 < 0.0001) {\n            this.apply1(parent, targetX, targetY, false, stretch, false, alpha);\n            child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n\n            return;\n        }\n        x = targetX - pp.tx;\n        y = targetY - pp.ty;\n        let tx = (x * d - y * b) * id - px;\n        let ty = (y * a - x * c) * id - py;\n        let dd = tx * tx + ty * ty;\n\n        if (softness != 0) {\n            softness *= psx * (csx + 1) * 0.5;\n            const td = Math.sqrt(dd);\n            const sd = td - l1 - l2 * psx + softness;\n\n            if (sd > 0) {\n                let p = Math.min(1, sd / (softness * 2)) - 1;\n\n                p = (sd - softness * (1 - p * p)) / td;\n                tx -= p * tx;\n                ty -= p * ty;\n                dd = tx * tx + ty * ty;\n            }\n        }\n        // eslint-disable-next-line no-restricted-syntax, no-labels\n        outer: if (u) {\n            l2 *= psx;\n            let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n\n            if (cos < -1) {\n                cos = -1;\n                a2 = Math.PI * bendDir;\n            } else if (cos > 1) {\n                cos = 1;\n                a2 = 0;\n                if (stretch) {\n                    a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;\n                    sx *= a;\n                    if (uniform) sy *= a;\n                }\n            } else a2 = Math.acos(cos) * bendDir;\n            a = l1 + l2 * cos;\n            b = l2 * Math.sin(a2);\n            a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n        } else {\n            a = psx * l2;\n            b = psy * l2;\n            const aa = a * a;\n            const bb = b * b;\n            const ta = Math.atan2(ty, tx);\n\n            c = bb * l1 * l1 + aa * dd - aa * bb;\n            const c1 = -2 * bb * l1;\n            const c2 = bb - aa;\n\n            d = c1 * c1 - 4 * c2 * c;\n            if (d >= 0) {\n                let q = Math.sqrt(d);\n\n                if (c1 < 0) q = -q;\n                q = -(c1 + q) * 0.5;\n                const r0 = q / c2;\n                const r1 = c / q;\n                const r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;\n\n                if (r * r <= dd) {\n                    y = Math.sqrt(dd - r * r) * bendDir;\n                    a1 = ta - Math.atan2(y, r);\n                    a2 = Math.atan2(y / psy, (r - l1) / psx);\n                    // eslint-disable-next-line no-labels\n                    break outer;\n                }\n            }\n            let minAngle = MathUtils.PI;\n            let minX = l1 - a;\n            let minDist = minX * minX;\n            let minY = 0;\n            let maxAngle = 0;\n            let maxX = l1 + a;\n            let maxDist = maxX * maxX;\n            let maxY = 0;\n\n            c = (-a * l1) / (aa - bb);\n            if (c >= -1 && c <= 1) {\n                c = Math.acos(c);\n                x = a * Math.cos(c) + l1;\n                y = b * Math.sin(c);\n                d = x * x + y * y;\n                if (d < minDist) {\n                    minAngle = c;\n                    minDist = d;\n                    minX = x;\n                    minY = y;\n                }\n                if (d > maxDist) {\n                    maxAngle = c;\n                    maxDist = d;\n                    maxX = x;\n                    maxY = y;\n                }\n            }\n            if (dd <= (minDist + maxDist) * 0.5) {\n                a1 = ta - Math.atan2(minY * bendDir, minX);\n                a2 = minAngle * bendDir;\n            } else {\n                a1 = ta - Math.atan2(maxY * bendDir, maxX);\n                a2 = maxAngle * bendDir;\n            }\n        }\n        const os = Math.atan2(cy, cx) * s2;\n        let rotation = parent.arotation;\n\n        a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;\n        if (a1 > 180) a1 -= 360;\n        else if (a1 < -180)\n            //\n            a1 += 360;\n        parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0);\n        rotation = child.arotation;\n        a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;\n        if (a2 > 180) a2 -= 360;\n        else if (a2 < -180)\n            //\n            a2 += 360;\n        child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n    }\n}\n"],"names":[],"mappings":"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"}