{"version":3,"file":"IkConstraint.mjs","sources":["../../src/core/IkConstraint.ts"],"sourcesContent":["import type { Constraint } from './Constraint';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { Bone } from './Bone';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class IkConstraint implements Constraint {\n    data: IkConstraintData;\n    bones: Array<Bone>;\n    target: Bone;\n    bendDirection = 0;\n    compress = false;\n    stretch = false;\n    mix = 1;\n\n    constructor(data: IkConstraintData, skeleton: Skeleton) {\n        if (data == null) throw new Error('data cannot be null.');\n        if (skeleton == null) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.mix = data.mix;\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++) this.bones.push(skeleton.findBone(data.bones[i].name));\n        this.target = skeleton.findBone(data.target.name);\n    }\n\n    getOrder() {\n        return this.data.order;\n    }\n\n    apply() {\n        this.update();\n    }\n\n    update() {\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.mix);\n                break;\n        }\n    }\n\n    /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world\n     * coordinate system. */\n    apply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number) {\n        if (!bone.appliedValid) bone.updateAppliedTransform();\n        const p = bone.parent.matrix;\n        const id = 1 / (p.a * p.d - p.b * p.c);\n        const x = targetX - p.tx;\n        const y = targetY - p.ty;\n        const tx = (x * p.d - y * p.c) * id - bone.ax;\n        const ty = (y * p.a - x * p.b) * id - bone.ay;\n        let rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation;\n\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            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    /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The\n     * 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, alpha: number) {\n        if (alpha == 0) {\n            child.updateWorldTransform();\n\n            return;\n        }\n        if (!parent.appliedValid) parent.updateAppliedTransform();\n        if (!child.appliedValid) child.updateAppliedTransform();\n        const px = parent.ax;\n        const py = parent.ay;\n        let psx = parent.ascaleX;\n        let sx = psx;\n        let psy = parent.ascaleY;\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) {\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        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 = targetX - pp.tx;\n        let y = targetY - pp.ty;\n        const tx = (x * d - y * b) * id - px;\n        const ty = (y * a - x * c) * id - py;\n        const dd = tx * tx + ty * ty;\n\n        x = cwx - pp.tx;\n        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 = 0;\n        let a2 = 0;\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) cos = -1;\n            else if (cos > 1) {\n                cos = 1;\n                if (stretch && l1 + l2 > 0.0001) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;\n            }\n            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) / 2;\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) / 2) {\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) a1 += 360;\n        parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 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) 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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"}