{"version":3,"file":"Bone.mjs","sources":["../../src/core/Bone.ts"],"sourcesContent":["import { Matrix } from '@pixi/core';\nimport type { Updatable } from './Updatable';\nimport type { BoneData } from './BoneData';\nimport type { Skeleton } from './Skeleton';\nimport { IBone, MathUtils, settings, TransformMode, Vector2 } from '@pixi-spine/base';\n\n/** Stores a bone's current pose.\n *\n * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a\n * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a\n * constraint or application code modifies the world transform after it was computed from the local transform.\n * @public\n * */\nexport class Bone implements Updatable, IBone {\n    // be careful! Spine b,c is c,b in pixi matrix\n    matrix = new Matrix();\n\n    get worldX(): number {\n        return this.matrix.tx;\n    }\n\n    get worldY(): number {\n        return this.matrix.ty;\n    }\n\n    /** The bone's setup pose data. */\n    data: BoneData;\n\n    /** The skeleton this bone belongs to. */\n    skeleton: Skeleton;\n\n    /** The parent bone, or null if this is the root bone. */\n    parent: Bone | null = null;\n\n    /** The immediate children of this bone. */\n    children = new Array<Bone>();\n\n    /** The local x translation. */\n    x = 0;\n\n    /** The local y translation. */\n    y = 0;\n\n    /** The local rotation in degrees, counter clockwise. */\n    rotation = 0;\n\n    /** The local scaleX. */\n    scaleX = 0;\n\n    /** The local scaleY. */\n    scaleY = 0;\n\n    /** The local shearX. */\n    shearX = 0;\n\n    /** The local shearY. */\n    shearY = 0;\n\n    /** The applied local x translation. */\n    ax = 0;\n\n    /** The applied local y translation. */\n    ay = 0;\n\n    /** The applied local rotation in degrees, counter clockwise. */\n    arotation = 0;\n\n    /** The applied local scaleX. */\n    ascaleX = 0;\n\n    /** The applied local scaleY. */\n    ascaleY = 0;\n\n    /** The applied local shearX. */\n    ashearX = 0;\n\n    /** The applied local shearY. */\n    ashearY = 0;\n\n    sorted = false;\n    active = false;\n\n    /** @param parent May be null. */\n    constructor(data: BoneData, skeleton: Skeleton, parent: Bone | null) {\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.skeleton = skeleton;\n        this.parent = parent;\n        this.setToSetupPose();\n    }\n\n    /** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the\n     * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */\n    isActive() {\n        return this.active;\n    }\n\n    /** Computes the world transform using the parent bone and this bone's local applied transform. */\n    update() {\n        this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY);\n    }\n\n    /** Computes the world transform using the parent bone and this bone's local transform.\n     *\n     * See {@link #updateWorldTransformWith()}. */\n    updateWorldTransform() {\n        this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);\n    }\n\n    /** Computes the world transform using the parent bone and the specified local transform. The applied transform is set to the\n     * specified local transform. Child bones are not updated.\n     *\n     * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n     * Runtimes Guide. */\n    updateWorldTransformWith(x: number, y: number, rotation: number, scaleX: number, scaleY: number, shearX: number, shearY: number) {\n        this.ax = x;\n        this.ay = y;\n        this.arotation = rotation;\n        this.ascaleX = scaleX;\n        this.ascaleY = scaleY;\n        this.ashearX = shearX;\n        this.ashearY = shearY;\n\n        const parent = this.parent;\n        const m = this.matrix;\n\n        const sx = this.skeleton.scaleX;\n        const sy = settings.yDown ? -this.skeleton.scaleY : this.skeleton.scaleY;\n\n        if (!parent) {\n            // Root bone.\n            const skeleton = this.skeleton;\n            const rotationY = rotation + 90 + shearY;\n\n            m.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;\n            m.c = MathUtils.cosDeg(rotationY) * scaleY * sx;\n            m.b = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;\n            m.d = MathUtils.sinDeg(rotationY) * scaleY * sy;\n            m.tx = x * sx + skeleton.x;\n            m.ty = y * sy + skeleton.y;\n\n            return;\n        }\n\n        let pa = parent.matrix.a;\n        let pb = parent.matrix.c;\n        let pc = parent.matrix.b;\n        let pd = parent.matrix.d;\n\n        m.tx = pa * x + pb * y + parent.matrix.tx;\n        m.ty = pc * x + pd * y + parent.matrix.ty;\n\n        switch (this.data.transformMode) {\n            case TransformMode.Normal: {\n                const rotationY = rotation + 90 + shearY;\n                const la = MathUtils.cosDeg(rotation + shearX) * scaleX;\n                const lb = MathUtils.cosDeg(rotationY) * scaleY;\n                const lc = MathUtils.sinDeg(rotation + shearX) * scaleX;\n                const ld = MathUtils.sinDeg(rotationY) * scaleY;\n\n                m.a = pa * la + pb * lc;\n                m.c = pa * lb + pb * ld;\n                m.b = pc * la + pd * lc;\n                m.d = pc * lb + pd * ld;\n\n                return;\n            }\n            case TransformMode.OnlyTranslation: {\n                const rotationY = rotation + 90 + shearY;\n\n                m.a = MathUtils.cosDeg(rotation + shearX) * scaleX;\n                m.c = MathUtils.cosDeg(rotationY) * scaleY;\n                m.b = MathUtils.sinDeg(rotation + shearX) * scaleX;\n                m.d = MathUtils.sinDeg(rotationY) * scaleY;\n                break;\n            }\n            case TransformMode.NoRotationOrReflection: {\n                let s = pa * pa + pc * pc;\n                let prx = 0;\n\n                if (s > 0.0001) {\n                    s = Math.abs(pa * pd - pb * pc) / s;\n                    pa /= sx;\n                    pc /= sy;\n                    pb = pc * s;\n                    pd = pa * s;\n                    prx = Math.atan2(pc, pa) * MathUtils.radDeg;\n                } else {\n                    pa = 0;\n                    pc = 0;\n                    prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;\n                }\n                const rx = rotation + shearX - prx;\n                const ry = rotation + shearY - prx + 90;\n                const la = MathUtils.cosDeg(rx) * scaleX;\n                const lb = MathUtils.cosDeg(ry) * scaleY;\n                const lc = MathUtils.sinDeg(rx) * scaleX;\n                const ld = MathUtils.sinDeg(ry) * scaleY;\n\n                m.a = pa * la - pb * lc;\n                m.c = pa * lb - pb * ld;\n                m.b = pc * la + pd * lc;\n                m.d = pc * lb + pd * ld;\n                break;\n            }\n            case TransformMode.NoScale:\n            case TransformMode.NoScaleOrReflection: {\n                const cos = MathUtils.cosDeg(rotation);\n                const sin = MathUtils.sinDeg(rotation);\n                let za = (pa * cos + pb * sin) / sx;\n                let zc = (pc * cos + pd * sin) / sy;\n                let s = Math.sqrt(za * za + zc * zc);\n\n                if (s > 0.00001) s = 1 / s;\n                za *= s;\n                zc *= s;\n                s = Math.sqrt(za * za + zc * zc);\n                if (this.data.transformMode == TransformMode.NoScale && pa * pd - pb * pc < 0 != (sx < 0 != sy < 0)) s = -s;\n                const r = Math.PI / 2 + Math.atan2(zc, za);\n                const zb = Math.cos(r) * s;\n                const zd = Math.sin(r) * s;\n                const la = MathUtils.cosDeg(shearX) * scaleX;\n                const lb = MathUtils.cosDeg(90 + shearY) * scaleY;\n                const lc = MathUtils.sinDeg(shearX) * scaleX;\n                const ld = MathUtils.sinDeg(90 + shearY) * scaleY;\n\n                m.a = za * la + zb * lc;\n                m.c = za * lb + zb * ld;\n                m.b = zc * la + zd * lc;\n                m.d = zc * lb + zd * ld;\n                break;\n            }\n        }\n        m.a *= sx;\n        m.c *= sx;\n        m.b *= sy;\n        m.d *= sy;\n    }\n\n    /** Sets this bone's local transform to the setup pose. */\n    setToSetupPose() {\n        const data = this.data;\n\n        this.x = data.x;\n        this.y = data.y;\n        this.rotation = data.rotation;\n        this.scaleX = data.scaleX;\n        this.scaleY = data.scaleY;\n        this.shearX = data.shearX;\n        this.shearY = data.shearY;\n    }\n\n    /** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */\n    getWorldRotationX() {\n        return Math.atan2(this.matrix.b, this.matrix.a) * MathUtils.radDeg;\n    }\n\n    /** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */\n    getWorldRotationY() {\n        return Math.atan2(this.matrix.d, this.matrix.c) * MathUtils.radDeg;\n    }\n\n    /** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */\n    getWorldScaleX() {\n        const m = this.matrix;\n\n        return Math.sqrt(m.a * m.a + m.b * m.b);\n    }\n\n    /** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */\n    getWorldScaleY() {\n        const m = this.matrix;\n\n        return Math.sqrt(m.c * m.c + m.d * m.d);\n    }\n\n    /** Computes the applied transform values from the world transform.\n     *\n     * If the world transform is modified (by a constraint, {@link #rotateWorld(float)}, etc) then this method should be called so\n     * the applied transform matches the world transform. The applied transform may be needed by other code (eg to apply other\n     * constraints).\n     *\n     * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after\n     * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */\n    updateAppliedTransform() {\n        const parent = this.parent;\n        const m = this.matrix;\n\n        if (!parent) {\n            this.ax = m.tx - this.skeleton.x;\n            this.ay = m.ty - this.skeleton.y;\n            this.arotation = Math.atan2(m.b, m.a) * MathUtils.radDeg;\n            this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b);\n            this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d);\n            this.ashearX = 0;\n            this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * MathUtils.radDeg;\n\n            return;\n        }\n        const pm = parent.matrix;\n        const pid = 1 / (pm.a * pm.d - pm.b * pm.c);\n        const dx = m.tx - pm.tx;\n        const dy = m.ty - pm.ty;\n\n        this.ax = dx * pm.d * pid - dy * pm.c * pid;\n        this.ay = dy * pm.a * pid - dx * pm.b * pid;\n        const ia = pid * pm.d;\n        const id = pid * pm.a;\n        const ib = pid * pm.c;\n        const ic = pid * pm.b;\n        const ra = ia * m.a - ib * m.b;\n        const rb = ia * m.c - ib * m.d;\n        const rc = id * m.b - ic * m.a;\n        const rd = id * m.d - ic * m.c;\n\n        this.ashearX = 0;\n        this.ascaleX = Math.sqrt(ra * ra + rc * rc);\n        if (this.ascaleX > 0.0001) {\n            const det = ra * rd - rb * rc;\n\n            this.ascaleY = det / this.ascaleX;\n            this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;\n            this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;\n        } else {\n            this.ascaleX = 0;\n            this.ascaleY = Math.sqrt(rb * rb + rd * rd);\n            this.ashearY = 0;\n            this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;\n        }\n    }\n\n    /** Transforms a point from world coordinates to the bone's local coordinates. */\n    worldToLocal(world: Vector2) {\n        const m = this.matrix;\n        const a = m.a;\n        const b = m.c;\n        const c = m.b;\n        const d = m.d;\n        const invDet = 1 / (a * d - b * c);\n        const x = world.x - m.tx;\n        const y = world.y - m.ty;\n\n        world.x = x * d * invDet - y * b * invDet;\n        world.y = y * a * invDet - x * c * invDet;\n\n        return world;\n    }\n\n    /** Transforms a point from the bone's local coordinates to world coordinates. */\n    localToWorld(local: Vector2) {\n        const m = this.matrix;\n        const x = local.x;\n        const y = local.y;\n\n        local.x = x * m.a + y * m.c + m.tx;\n        local.y = x * m.b + y * m.d + m.ty;\n\n        return local;\n    }\n\n    /** Transforms a world rotation to a local rotation. */\n    worldToLocalRotation(worldRotation: number) {\n        const sin = MathUtils.sinDeg(worldRotation);\n        const cos = MathUtils.cosDeg(worldRotation);\n        const mat = this.matrix;\n\n        return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * MathUtils.radDeg;\n    }\n\n    /** Transforms a local rotation to a world rotation. */\n    localToWorldRotation(localRotation: number) {\n        localRotation -= this.rotation - this.shearX;\n        const sin = MathUtils.sinDeg(localRotation);\n        const cos = MathUtils.cosDeg(localRotation);\n        const mat = this.matrix;\n\n        return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * MathUtils.radDeg;\n    }\n\n    /** Rotates the world transform the specified amount.\n     * <p>\n     * After changes are made to the world transform, {@link #updateAppliedTransform()} should be called and {@link #update()} will\n     * need to be called on any child bones, recursively. */\n    rotateWorld(degrees: number) {\n        const mat = this.matrix;\n        const a = mat.a;\n        const b = mat.c;\n        const c = mat.b;\n        const d = mat.d;\n        const cos = MathUtils.cosDeg(degrees);\n        const sin = MathUtils.sinDeg(degrees);\n\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}\n"],"names":[],"mappings":"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"}