{"version":3,"file":"PathConstraint.mjs","sources":["../../src/core/PathConstraint.ts"],"sourcesContent":["import { PathAttachment } from './attachments';\nimport type { Updatable } from './Updatable';\nimport { PathConstraintData, SpacingMode } from './PathConstraintData';\nimport type { Bone } from './Bone';\nimport type { Slot } from './Slot';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils, PositionMode, RotateMode, Utils } from '@pixi-spine/base';\n/**\n * @public\n */\nexport class PathConstraint implements Updatable {\n    static NONE = -1;\n    static BEFORE = -2;\n    static AFTER = -3;\n    static epsilon = 0.00001;\n\n    data: PathConstraintData;\n    bones: Array<Bone>;\n    target: Slot;\n    position = 0;\n    spacing = 0;\n    rotateMix = 0;\n    translateMix = 0;\n\n    spaces = new Array<number>();\n    positions = new Array<number>();\n    world = new Array<number>();\n    curves = new Array<number>();\n    lengths = new Array<number>();\n    segments = new Array<number>();\n\n    active = false;\n\n    constructor(data: PathConstraintData, 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.bones = new Array<Bone>();\n        for (let i = 0, n = data.bones.length; i < n; i++) this.bones.push(skeleton.findBone(data.bones[i].name));\n        this.target = skeleton.findSlot(data.target.name);\n        this.position = data.position;\n        this.spacing = data.spacing;\n        this.rotateMix = data.rotateMix;\n        this.translateMix = data.translateMix;\n    }\n\n    isActive() {\n        return this.active;\n    }\n\n    apply() {\n        this.update();\n    }\n\n    update() {\n        const attachment = this.target.getAttachment();\n\n        if (!(attachment instanceof PathAttachment)) return;\n\n        const rotateMix = this.rotateMix;\n        const translateMix = this.translateMix;\n        const translate = translateMix > 0;\n        const rotate = rotateMix > 0;\n\n        if (!translate && !rotate) return;\n\n        const data = this.data;\n        const spacingMode = data.spacingMode;\n        const lengthSpacing = spacingMode == SpacingMode.Length;\n        const rotateMode = data.rotateMode;\n        const tangents = rotateMode == RotateMode.Tangent;\n        const scale = rotateMode == RotateMode.ChainScale;\n        const boneCount = this.bones.length;\n        const spacesCount = tangents ? boneCount : boneCount + 1;\n        const bones = this.bones;\n        const spaces = Utils.setArraySize(this.spaces, spacesCount);\n        let lengths: Array<number> = null;\n        const spacing = this.spacing;\n\n        if (scale || lengthSpacing) {\n            if (scale) lengths = Utils.setArraySize(this.lengths, boneCount);\n            for (let i = 0, n = spacesCount - 1; i < n; ) {\n                const bone = bones[i];\n                const setupLength = bone.data.length;\n\n                if (setupLength < PathConstraint.epsilon) {\n                    if (scale) lengths[i] = 0;\n                    spaces[++i] = 0;\n                } else {\n                    const x = setupLength * bone.matrix.a;\n                    const y = setupLength * bone.matrix.b;\n                    const length = Math.sqrt(x * x + y * y);\n\n                    if (scale) lengths[i] = length;\n                    spaces[++i] = ((lengthSpacing ? setupLength + spacing : spacing) * length) / setupLength;\n                }\n            }\n        } else {\n            for (let i = 1; i < spacesCount; i++) spaces[i] = spacing;\n        }\n\n        const positions = this.computeWorldPositions(\n            <PathAttachment>attachment,\n            spacesCount,\n            tangents,\n            data.positionMode == PositionMode.Percent,\n            spacingMode == SpacingMode.Percent\n        );\n        let boneX = positions[0];\n        let boneY = positions[1];\n        let offsetRotation = data.offsetRotation;\n        let tip = false;\n\n        if (offsetRotation == 0) tip = rotateMode == RotateMode.Chain;\n        else {\n            tip = false;\n            const p = this.target.bone.matrix;\n\n            offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;\n        }\n        for (let i = 0, p = 3; i < boneCount; i++, p += 3) {\n            const bone = bones[i];\n            const mat = bone.matrix;\n\n            mat.tx += (boneX - mat.tx) * translateMix;\n            mat.ty += (boneY - mat.ty) * translateMix;\n            const x = positions[p];\n            const y = positions[p + 1];\n            const dx = x - boneX;\n            const dy = y - boneY;\n\n            if (scale) {\n                const length = lengths[i];\n\n                if (length != 0) {\n                    const s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1;\n\n                    mat.a *= s;\n                    mat.b *= s;\n                }\n            }\n            boneX = x;\n            boneY = y;\n            if (rotate) {\n                const a = mat.a;\n                const b = mat.c;\n                const c = mat.b;\n                const d = mat.d;\n                let r = 0;\n                let cos = 0;\n                let sin = 0;\n\n                if (tangents)\n                    if (tangents) r = positions[p - 1];\n                    else if (spaces[i + 1] == 0) r = positions[p + 2];\n                    else r = Math.atan2(dy, dx);\n                r -= Math.atan2(c, a);\n                if (tip) {\n                    cos = Math.cos(r);\n                    sin = Math.sin(r);\n                    const length = bone.data.length;\n\n                    boneX += (length * (cos * a - sin * c) - dx) * rotateMix;\n                    boneY += (length * (sin * a + cos * c) - dy) * rotateMix;\n                } else {\n                    r += offsetRotation;\n                }\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                r *= rotateMix;\n                cos = Math.cos(r);\n                sin = Math.sin(r);\n                mat.a = cos * a - sin * c;\n                mat.c = cos * b - sin * d;\n                mat.b = sin * a + cos * c;\n                mat.d = sin * b + cos * d;\n            }\n            bone.appliedValid = false;\n        }\n    }\n\n    computeWorldPositions(path: PathAttachment, spacesCount: number, tangents: boolean, percentPosition: boolean, percentSpacing: boolean) {\n        const target = this.target;\n        let position = this.position;\n        const spaces = this.spaces;\n        const out = Utils.setArraySize(this.positions, spacesCount * 3 + 2);\n        let world: Array<number> = null;\n        const closed = path.closed;\n        let verticesLength = path.worldVerticesLength;\n        let curveCount = verticesLength / 6;\n        let prevCurve = PathConstraint.NONE;\n\n        if (!path.constantSpeed) {\n            const lengths = path.lengths;\n\n            curveCount -= closed ? 1 : 2;\n            const pathLength = lengths[curveCount];\n\n            if (percentPosition) position *= pathLength;\n            if (percentSpacing) {\n                for (let i = 0; i < spacesCount; i++) spaces[i] *= pathLength;\n            }\n            world = Utils.setArraySize(this.world, 8);\n            for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {\n                const space = spaces[i];\n\n                position += space;\n                let p = position;\n\n                if (closed) {\n                    p %= pathLength;\n                    if (p < 0) p += pathLength;\n                    curve = 0;\n                } else if (p < 0) {\n                    if (prevCurve != PathConstraint.BEFORE) {\n                        prevCurve = PathConstraint.BEFORE;\n                        path.computeWorldVertices(target, 2, 4, world, 0, 2);\n                    }\n                    this.addBeforePosition(p, world, 0, out, o);\n                    continue;\n                } else if (p > pathLength) {\n                    if (prevCurve != PathConstraint.AFTER) {\n                        prevCurve = PathConstraint.AFTER;\n                        path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);\n                    }\n                    this.addAfterPosition(p - pathLength, world, 0, out, o);\n                    continue;\n                }\n\n                // Determine curve containing position.\n                for (; ; curve++) {\n                    const length = lengths[curve];\n\n                    if (p > length) continue;\n                    if (curve == 0) p /= length;\n                    else {\n                        const prev = lengths[curve - 1];\n\n                        p = (p - prev) / (length - prev);\n                    }\n                    break;\n                }\n                if (curve != prevCurve) {\n                    prevCurve = curve;\n                    if (closed && curve == curveCount) {\n                        path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);\n                        path.computeWorldVertices(target, 0, 4, world, 4, 2);\n                    } else path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);\n                }\n                this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space == 0));\n            }\n\n            return out;\n        }\n\n        // World vertices.\n        if (closed) {\n            verticesLength += 2;\n            world = Utils.setArraySize(this.world, verticesLength);\n            path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);\n            path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);\n            world[verticesLength - 2] = world[0];\n            world[verticesLength - 1] = world[1];\n        } else {\n            curveCount--;\n            verticesLength -= 4;\n            world = Utils.setArraySize(this.world, verticesLength);\n            path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);\n        }\n\n        // Curve lengths.\n        const curves = Utils.setArraySize(this.curves, curveCount);\n        let pathLength = 0;\n        let x1 = world[0];\n        let y1 = world[1];\n        let cx1 = 0;\n        let cy1 = 0;\n        let cx2 = 0;\n        let cy2 = 0;\n        let x2 = 0;\n        let y2 = 0;\n        let tmpx = 0;\n        let tmpy = 0;\n        let dddfx = 0;\n        let dddfy = 0;\n        let ddfx = 0;\n        let ddfy = 0;\n        let dfx = 0;\n        let dfy = 0;\n\n        for (let i = 0, w = 2; i < curveCount; i++, w += 6) {\n            cx1 = world[w];\n            cy1 = world[w + 1];\n            cx2 = world[w + 2];\n            cy2 = world[w + 3];\n            x2 = world[w + 4];\n            y2 = world[w + 5];\n            tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;\n            tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;\n            dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;\n            dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;\n            ddfx = tmpx * 2 + dddfx;\n            ddfy = tmpy * 2 + dddfy;\n            dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;\n            dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx;\n            dfy += ddfy;\n            ddfx += dddfx;\n            ddfy += dddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx;\n            dfy += ddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx + dddfx;\n            dfy += ddfy + dddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            curves[i] = pathLength;\n            x1 = x2;\n            y1 = y2;\n        }\n        if (percentPosition) position *= pathLength;\n        if (percentSpacing) {\n            for (let i = 0; i < spacesCount; i++) spaces[i] *= pathLength;\n        }\n\n        const segments = this.segments;\n        let curveLength = 0;\n\n        for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {\n            const space = spaces[i];\n\n            position += space;\n            let p = position;\n\n            if (closed) {\n                p %= pathLength;\n                if (p < 0) p += pathLength;\n                curve = 0;\n            } else if (p < 0) {\n                this.addBeforePosition(p, world, 0, out, o);\n                continue;\n            } else if (p > pathLength) {\n                this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);\n                continue;\n            }\n\n            // Determine curve containing position.\n            for (; ; curve++) {\n                const length = curves[curve];\n\n                if (p > length) continue;\n                if (curve == 0) p /= length;\n                else {\n                    const prev = curves[curve - 1];\n\n                    p = (p - prev) / (length - prev);\n                }\n                break;\n            }\n\n            // Curve segment lengths.\n            if (curve != prevCurve) {\n                prevCurve = curve;\n                let ii = curve * 6;\n\n                x1 = world[ii];\n                y1 = world[ii + 1];\n                cx1 = world[ii + 2];\n                cy1 = world[ii + 3];\n                cx2 = world[ii + 4];\n                cy2 = world[ii + 5];\n                x2 = world[ii + 6];\n                y2 = world[ii + 7];\n                tmpx = (x1 - cx1 * 2 + cx2) * 0.03;\n                tmpy = (y1 - cy1 * 2 + cy2) * 0.03;\n                dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;\n                dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;\n                ddfx = tmpx * 2 + dddfx;\n                ddfy = tmpy * 2 + dddfy;\n                dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;\n                dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;\n                curveLength = Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[0] = curveLength;\n                for (ii = 1; ii < 8; ii++) {\n                    dfx += ddfx;\n                    dfy += ddfy;\n                    ddfx += dddfx;\n                    ddfy += dddfy;\n                    curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                    segments[ii] = curveLength;\n                }\n                dfx += ddfx;\n                dfy += ddfy;\n                curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[8] = curveLength;\n                dfx += ddfx + dddfx;\n                dfy += ddfy + dddfy;\n                curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[9] = curveLength;\n                segment = 0;\n            }\n\n            // Weight by segment length.\n            p *= curveLength;\n            for (; ; segment++) {\n                const length = segments[segment];\n\n                if (p > length) continue;\n                if (segment == 0) p /= length;\n                else {\n                    const prev = segments[segment - 1];\n\n                    p = segment + (p - prev) / (length - prev);\n                }\n                break;\n            }\n            this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));\n        }\n\n        return out;\n    }\n\n    addBeforePosition(p: number, temp: Array<number>, i: number, out: Array<number>, o: number) {\n        const x1 = temp[i];\n        const y1 = temp[i + 1];\n        const dx = temp[i + 2] - x1;\n        const dy = temp[i + 3] - y1;\n        const r = Math.atan2(dy, dx);\n\n        out[o] = x1 + p * Math.cos(r);\n        out[o + 1] = y1 + p * Math.sin(r);\n        out[o + 2] = r;\n    }\n\n    addAfterPosition(p: number, temp: Array<number>, i: number, out: Array<number>, o: number) {\n        const x1 = temp[i + 2];\n        const y1 = temp[i + 3];\n        const dx = x1 - temp[i];\n        const dy = y1 - temp[i + 1];\n        const r = Math.atan2(dy, dx);\n\n        out[o] = x1 + p * Math.cos(r);\n        out[o + 1] = y1 + p * Math.sin(r);\n        out[o + 2] = r;\n    }\n\n    addCurvePosition(\n        p: number,\n        x1: number,\n        y1: number,\n        cx1: number,\n        cy1: number,\n        cx2: number,\n        cy2: number,\n        x2: number,\n        y2: number,\n        out: Array<number>,\n        o: number,\n        tangents: boolean\n    ) {\n        if (p == 0 || isNaN(p)) p = 0.0001;\n        const tt = p * p;\n        const ttt = tt * p;\n        const u = 1 - p;\n        const uu = u * u;\n        const uuu = uu * u;\n        const ut = u * p;\n        const ut3 = ut * 3;\n        const uut3 = u * ut3;\n        const utt3 = ut3 * p;\n        const x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt;\n        const y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;\n\n        out[o] = x;\n        out[o + 1] = y;\n        if (tangents) out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));\n    }\n}\n"],"names":["pathLength"],"mappings":"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"}