{"version":3,"file":"Animation.mjs","sources":["../../src/core/Animation.ts"],"sourcesContent":["import type { Event } from './Event';\nimport type { Skeleton } from './Skeleton';\nimport { Attachment, VertexAttachment } from './attachments';\nimport { ArrayLike, MathUtils, Utils, MixBlend, MixDirection, IAnimation, ITimeline } from '@pixi-spine/base';\nimport type { Slot } from './Slot';\nimport type { IkConstraint } from './IkConstraint';\nimport type { TransformConstraint } from './TransformConstraint';\nimport type { PathConstraint } from './PathConstraint';\n\n/**\n * @public\n */\nexport class Animation implements IAnimation<Timeline> {\n    name: string;\n    timelines: Array<Timeline>;\n    duration: number;\n\n    constructor(name: string, timelines: Array<Timeline>, duration: number) {\n        if (name == null) throw new Error('name cannot be null.');\n        if (timelines == null) throw new Error('timelines cannot be null.');\n        this.name = name;\n        this.timelines = timelines;\n        this.duration = duration;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, loop: boolean, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        if (skeleton == null) throw new Error('skeleton cannot be null.');\n\n        if (loop && this.duration != 0) {\n            time %= this.duration;\n            if (lastTime > 0) lastTime %= this.duration;\n        }\n\n        const timelines = this.timelines;\n\n        for (let i = 0, n = timelines.length; i < n; i++) timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);\n    }\n\n    static binarySearch(values: ArrayLike<number>, target: number, step = 1) {\n        let low = 0;\n        let high = values.length / step - 2;\n\n        if (high == 0) return step;\n        let current = high >>> 1;\n\n        while (true) {\n            if (values[(current + 1) * step] <= target) low = current + 1;\n            else high = current;\n            if (low == high) return (low + 1) * step;\n            current = (low + high) >>> 1;\n        }\n    }\n\n    static linearSearch(values: ArrayLike<number>, target: number, step: number) {\n        for (let i = 0, last = values.length - step; i <= last; i += step) if (values[i] > target) return i;\n\n        return -1;\n    }\n}\n\n/**\n * @public\n */\nexport interface Timeline extends ITimeline {\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection): void;\n    getPropertyId(): number;\n}\n\n/**\n * @public\n */\nexport enum TimelineType {\n    rotate,\n    translate,\n    scale,\n    shear,\n    attachment,\n    color,\n    deform,\n    event,\n    drawOrder,\n    ikConstraint,\n    transformConstraint,\n    pathConstraintPosition,\n    pathConstraintSpacing,\n    pathConstraintMix,\n    twoColor,\n}\n\n/**\n * @public\n */\nexport abstract class CurveTimeline implements Timeline {\n    static LINEAR = 0;\n    static STEPPED = 1;\n    static BEZIER = 2;\n    static BEZIER_SIZE = 10 * 2 - 1;\n\n    private curves: ArrayLike<number>; // type, x, y, ...\n\n    abstract getPropertyId(): number;\n\n    constructor(frameCount: number) {\n        if (frameCount <= 0) throw new Error(`frameCount must be > 0: ${frameCount}`);\n        this.curves = Utils.newFloatArray((frameCount - 1) * CurveTimeline.BEZIER_SIZE);\n    }\n\n    getFrameCount() {\n        return this.curves.length / CurveTimeline.BEZIER_SIZE + 1;\n    }\n\n    setLinear(frameIndex: number) {\n        this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.LINEAR;\n    }\n\n    setStepped(frameIndex: number) {\n        this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.STEPPED;\n    }\n\n    getCurveType(frameIndex: number): number {\n        const index = frameIndex * CurveTimeline.BEZIER_SIZE;\n\n        if (index == this.curves.length) return CurveTimeline.LINEAR;\n        const type = this.curves[index];\n\n        if (type == CurveTimeline.LINEAR) return CurveTimeline.LINEAR;\n        if (type == CurveTimeline.STEPPED) return CurveTimeline.STEPPED;\n\n        return CurveTimeline.BEZIER;\n    }\n\n    /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next.\n     * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of\n     * the difference between the keyframe's values. */\n    setCurve(frameIndex: number, cx1: number, cy1: number, cx2: number, cy2: number) {\n        const tmpx = (-cx1 * 2 + cx2) * 0.03;\n        const tmpy = (-cy1 * 2 + cy2) * 0.03;\n        const dddfx = ((cx1 - cx2) * 3 + 1) * 0.006;\n        const dddfy = ((cy1 - cy2) * 3 + 1) * 0.006;\n        let ddfx = tmpx * 2 + dddfx;\n        let ddfy = tmpy * 2 + dddfy;\n        let dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667;\n        let dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667;\n\n        let i = frameIndex * CurveTimeline.BEZIER_SIZE;\n        const curves = this.curves;\n\n        curves[i++] = CurveTimeline.BEZIER;\n\n        let x = dfx;\n        let y = dfy;\n\n        for (let n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) {\n            curves[i] = x;\n            curves[i + 1] = y;\n            dfx += ddfx;\n            dfy += ddfy;\n            ddfx += dddfx;\n            ddfy += dddfy;\n            x += dfx;\n            y += dfy;\n        }\n    }\n\n    getCurvePercent(frameIndex: number, percent: number) {\n        percent = MathUtils.clamp(percent, 0, 1);\n        const curves = this.curves;\n        let i = frameIndex * CurveTimeline.BEZIER_SIZE;\n        const type = curves[i];\n\n        if (type == CurveTimeline.LINEAR) return percent;\n        if (type == CurveTimeline.STEPPED) return 0;\n        i++;\n        let x = 0;\n\n        for (let start = i, n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) {\n            x = curves[i];\n            if (x >= percent) {\n                let prevX: number;\n                let prevY: number;\n\n                if (i == start) {\n                    prevX = 0;\n                    prevY = 0;\n                } else {\n                    prevX = curves[i - 2];\n                    prevY = curves[i - 1];\n                }\n\n                return prevY + ((curves[i + 1] - prevY) * (percent - prevX)) / (x - prevX);\n            }\n        }\n        const y = curves[i - 1];\n\n        return y + ((1 - y) * (percent - x)) / (1 - x); // Last point is 1,1.\n    }\n\n    abstract apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection): void;\n}\n\n/**\n * @public\n */\nexport class RotateTimeline extends CurveTimeline {\n    static ENTRIES = 2;\n    static PREV_TIME = -2;\n    static PREV_ROTATION = -1;\n    static ROTATION = 1;\n\n    boneIndex: number;\n    frames: ArrayLike<number>; // time, degrees, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount << 1);\n    }\n\n    getPropertyId() {\n        return (TimelineType.rotate << 24) + this.boneIndex;\n    }\n\n    /** Sets the time and angle of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, degrees: number) {\n        frameIndex <<= 1;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + RotateTimeline.ROTATION] = degrees;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.rotation = bone.data.rotation;\n\n                    return;\n                case MixBlend.first:\n                    const r = bone.data.rotation - bone.rotation;\n\n                    bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;\n            }\n\n            return;\n        }\n\n        if (time >= frames[frames.length - RotateTimeline.ENTRIES]) {\n            // Time is after last frame.\n            let r = frames[frames.length + RotateTimeline.PREV_ROTATION];\n\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.rotation = bone.data.rotation + r * alpha;\n                    break;\n                case MixBlend.first:\n                case MixBlend.replace:\n                    r += bone.data.rotation - bone.rotation;\n                    r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; // Wrap within -180 and 180.\n                case MixBlend.add:\n                    bone.rotation += r * alpha;\n            }\n\n            return;\n        }\n\n        // Interpolate between the previous frame and the current frame.\n        const frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES);\n        const prevRotation = frames[frame + RotateTimeline.PREV_ROTATION];\n        const frameTime = frames[frame];\n        const percent = this.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime));\n\n        let r = frames[frame + RotateTimeline.ROTATION] - prevRotation;\n\n        r = prevRotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * percent;\n        switch (blend) {\n            case MixBlend.setup:\n                bone.rotation = bone.data.rotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                r += bone.data.rotation - bone.rotation;\n            case MixBlend.add:\n                bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class TranslateTimeline extends CurveTimeline {\n    static ENTRIES = 3;\n    static PREV_TIME = -3;\n    static PREV_X = -2;\n    static PREV_Y = -1;\n    static X = 1;\n    static Y = 2;\n\n    boneIndex: number;\n    frames: ArrayLike<number>; // time, x, y, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * TranslateTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.translate << 24) + this.boneIndex;\n    }\n\n    /** Sets the time and value of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, x: number, y: number) {\n        frameIndex *= TranslateTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + TranslateTimeline.X] = x;\n        this.frames[frameIndex + TranslateTimeline.Y] = y;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.x = bone.data.x;\n                    bone.y = bone.data.y;\n\n                    return;\n                case MixBlend.first:\n                    bone.x += (bone.data.x - bone.x) * alpha;\n                    bone.y += (bone.data.y - bone.y) * alpha;\n            }\n\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n\n        if (time >= frames[frames.length - TranslateTimeline.ENTRIES]) {\n            // Time is after last frame.\n            x = frames[frames.length + TranslateTimeline.PREV_X];\n            y = frames[frames.length + TranslateTimeline.PREV_Y];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, TranslateTimeline.ENTRIES);\n\n            x = frames[frame + TranslateTimeline.PREV_X];\n            y = frames[frame + TranslateTimeline.PREV_Y];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(frame / TranslateTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + TranslateTimeline.PREV_TIME] - frameTime));\n\n            x += (frames[frame + TranslateTimeline.X] - x) * percent;\n            y += (frames[frame + TranslateTimeline.Y] - y) * percent;\n        }\n        switch (blend) {\n            case MixBlend.setup:\n                bone.x = bone.data.x + x * alpha;\n                bone.y = bone.data.y + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.x += (bone.data.x + x - bone.x) * alpha;\n                bone.y += (bone.data.y + y - bone.y) * alpha;\n                break;\n            case MixBlend.add:\n                bone.x += x * alpha;\n                bone.y += y * alpha;\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class ScaleTimeline extends TranslateTimeline {\n    constructor(frameCount: number) {\n        super(frameCount);\n    }\n\n    getPropertyId() {\n        return (TimelineType.scale << 24) + this.boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.scaleX = bone.data.scaleX;\n                    bone.scaleY = bone.data.scaleY;\n\n                    return;\n                case MixBlend.first:\n                    bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;\n                    bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;\n            }\n\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n\n        if (time >= frames[frames.length - ScaleTimeline.ENTRIES]) {\n            // Time is after last frame.\n            x = frames[frames.length + ScaleTimeline.PREV_X] * bone.data.scaleX;\n            y = frames[frames.length + ScaleTimeline.PREV_Y] * bone.data.scaleY;\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, ScaleTimeline.ENTRIES);\n\n            x = frames[frame + ScaleTimeline.PREV_X];\n            y = frames[frame + ScaleTimeline.PREV_Y];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(frame / ScaleTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ScaleTimeline.PREV_TIME] - frameTime));\n\n            x = (x + (frames[frame + ScaleTimeline.X] - x) * percent) * bone.data.scaleX;\n            y = (y + (frames[frame + ScaleTimeline.Y] - y) * percent) * bone.data.scaleY;\n        }\n        if (alpha == 1) {\n            if (blend == MixBlend.add) {\n                bone.scaleX += x - bone.data.scaleX;\n                bone.scaleY += y - bone.data.scaleY;\n            } else {\n                bone.scaleX = x;\n                bone.scaleY = y;\n            }\n        } else {\n            let bx = 0;\n            let by = 0;\n\n            if (direction == MixDirection.mixOut) {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = bone.data.scaleX;\n                        by = bone.data.scaleY;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = bone.scaleX;\n                        by = bone.scaleY;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bx = bone.scaleX;\n                        by = bone.scaleY;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;\n                }\n            } else {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);\n                        by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = Math.abs(bone.scaleX) * MathUtils.signum(x);\n                        by = Math.abs(bone.scaleY) * MathUtils.signum(y);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bx = MathUtils.signum(x);\n                        by = MathUtils.signum(y);\n                        bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;\n                        bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;\n                }\n            }\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class ShearTimeline extends TranslateTimeline {\n    constructor(frameCount: number) {\n        super(frameCount);\n    }\n\n    getPropertyId() {\n        return (TimelineType.shear << 24) + this.boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.shearX = bone.data.shearX;\n                    bone.shearY = bone.data.shearY;\n\n                    return;\n                case MixBlend.first:\n                    bone.shearX += (bone.data.shearX - bone.shearX) * alpha;\n                    bone.shearY += (bone.data.shearY - bone.shearY) * alpha;\n            }\n\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n\n        if (time >= frames[frames.length - ShearTimeline.ENTRIES]) {\n            // Time is after last frame.\n            x = frames[frames.length + ShearTimeline.PREV_X];\n            y = frames[frames.length + ShearTimeline.PREV_Y];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, ShearTimeline.ENTRIES);\n\n            x = frames[frame + ShearTimeline.PREV_X];\n            y = frames[frame + ShearTimeline.PREV_Y];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(frame / ShearTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ShearTimeline.PREV_TIME] - frameTime));\n\n            x = x + (frames[frame + ShearTimeline.X] - x) * percent;\n            y = y + (frames[frame + ShearTimeline.Y] - y) * percent;\n        }\n        switch (blend) {\n            case MixBlend.setup:\n                bone.shearX = bone.data.shearX + x * alpha;\n                bone.shearY = bone.data.shearY + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;\n                bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;\n                break;\n            case MixBlend.add:\n                bone.shearX += x * alpha;\n                bone.shearY += y * alpha;\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class ColorTimeline extends CurveTimeline {\n    static ENTRIES = 5;\n    static PREV_TIME = -5;\n    static PREV_R = -4;\n    static PREV_G = -3;\n    static PREV_B = -2;\n    static PREV_A = -1;\n    static R = 1;\n    static G = 2;\n    static B = 3;\n    static A = 4;\n\n    slotIndex: number;\n    frames: ArrayLike<number>; // time, r, g, b, a, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * ColorTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.color << 24) + this.slotIndex;\n    }\n\n    /** Sets the time and value of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, r: number, g: number, b: number, a: number) {\n        frameIndex *= ColorTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + ColorTimeline.R] = r;\n        this.frames[frameIndex + ColorTimeline.G] = g;\n        this.frames[frameIndex + ColorTimeline.B] = b;\n        this.frames[frameIndex + ColorTimeline.A] = a;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    slot.color.setFromColor(slot.data.color);\n\n                    return;\n                case MixBlend.first:\n                    const color = slot.color;\n                    const setup = slot.data.color;\n\n                    color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        let a = 0;\n\n        if (time >= frames[frames.length - ColorTimeline.ENTRIES]) {\n            // Time is after last frame.\n            const i = frames.length;\n\n            r = frames[i + ColorTimeline.PREV_R];\n            g = frames[i + ColorTimeline.PREV_G];\n            b = frames[i + ColorTimeline.PREV_B];\n            a = frames[i + ColorTimeline.PREV_A];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, ColorTimeline.ENTRIES);\n\n            r = frames[frame + ColorTimeline.PREV_R];\n            g = frames[frame + ColorTimeline.PREV_G];\n            b = frames[frame + ColorTimeline.PREV_B];\n            a = frames[frame + ColorTimeline.PREV_A];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(frame / ColorTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ColorTimeline.PREV_TIME] - frameTime));\n\n            r += (frames[frame + ColorTimeline.R] - r) * percent;\n            g += (frames[frame + ColorTimeline.G] - g) * percent;\n            b += (frames[frame + ColorTimeline.B] - b) * percent;\n            a += (frames[frame + ColorTimeline.A] - a) * percent;\n        }\n        if (alpha == 1) slot.color.set(r, g, b, a);\n        else {\n            const color = slot.color;\n\n            if (blend == MixBlend.setup) color.setFromColor(slot.data.color);\n            color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class TwoColorTimeline extends CurveTimeline {\n    static ENTRIES = 8;\n    static PREV_TIME = -8;\n    static PREV_R = -7;\n    static PREV_G = -6;\n    static PREV_B = -5;\n    static PREV_A = -4;\n    static PREV_R2 = -3;\n    static PREV_G2 = -2;\n    static PREV_B2 = -1;\n    static R = 1;\n    static G = 2;\n    static B = 3;\n    static A = 4;\n    static R2 = 5;\n    static G2 = 6;\n    static B2 = 7;\n\n    slotIndex: number;\n    frames: ArrayLike<number>; // time, r, g, b, a, r2, g2, b2, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * TwoColorTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.twoColor << 24) + this.slotIndex;\n    }\n\n    /** Sets the time and value of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, r: number, g: number, b: number, a: number, r2: number, g2: number, b2: number) {\n        frameIndex *= TwoColorTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + TwoColorTimeline.R] = r;\n        this.frames[frameIndex + TwoColorTimeline.G] = g;\n        this.frames[frameIndex + TwoColorTimeline.B] = b;\n        this.frames[frameIndex + TwoColorTimeline.A] = a;\n        this.frames[frameIndex + TwoColorTimeline.R2] = r2;\n        this.frames[frameIndex + TwoColorTimeline.G2] = g2;\n        this.frames[frameIndex + TwoColorTimeline.B2] = b2;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    slot.color.setFromColor(slot.data.color);\n                    slot.darkColor.setFromColor(slot.data.darkColor);\n\n                    return;\n                case MixBlend.first:\n                    const light = slot.color;\n                    const dark = slot.darkColor;\n                    const setupLight = slot.data.color;\n                    const setupDark = slot.data.darkColor;\n\n                    light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);\n                    dark.add((setupDark.r - dark.r) * alpha, (setupDark.g - dark.g) * alpha, (setupDark.b - dark.b) * alpha, 0);\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        let a = 0;\n        let r2 = 0;\n        let g2 = 0;\n        let b2 = 0;\n\n        if (time >= frames[frames.length - TwoColorTimeline.ENTRIES]) {\n            // Time is after last frame.\n            const i = frames.length;\n\n            r = frames[i + TwoColorTimeline.PREV_R];\n            g = frames[i + TwoColorTimeline.PREV_G];\n            b = frames[i + TwoColorTimeline.PREV_B];\n            a = frames[i + TwoColorTimeline.PREV_A];\n            r2 = frames[i + TwoColorTimeline.PREV_R2];\n            g2 = frames[i + TwoColorTimeline.PREV_G2];\n            b2 = frames[i + TwoColorTimeline.PREV_B2];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, TwoColorTimeline.ENTRIES);\n\n            r = frames[frame + TwoColorTimeline.PREV_R];\n            g = frames[frame + TwoColorTimeline.PREV_G];\n            b = frames[frame + TwoColorTimeline.PREV_B];\n            a = frames[frame + TwoColorTimeline.PREV_A];\n            r2 = frames[frame + TwoColorTimeline.PREV_R2];\n            g2 = frames[frame + TwoColorTimeline.PREV_G2];\n            b2 = frames[frame + TwoColorTimeline.PREV_B2];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(frame / TwoColorTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + TwoColorTimeline.PREV_TIME] - frameTime));\n\n            r += (frames[frame + TwoColorTimeline.R] - r) * percent;\n            g += (frames[frame + TwoColorTimeline.G] - g) * percent;\n            b += (frames[frame + TwoColorTimeline.B] - b) * percent;\n            a += (frames[frame + TwoColorTimeline.A] - a) * percent;\n            r2 += (frames[frame + TwoColorTimeline.R2] - r2) * percent;\n            g2 += (frames[frame + TwoColorTimeline.G2] - g2) * percent;\n            b2 += (frames[frame + TwoColorTimeline.B2] - b2) * percent;\n        }\n        if (alpha == 1) {\n            slot.color.set(r, g, b, a);\n            slot.darkColor.set(r2, g2, b2, 1);\n        } else {\n            const light = slot.color;\n            const dark = slot.darkColor;\n\n            if (blend == MixBlend.setup) {\n                light.setFromColor(slot.data.color);\n                dark.setFromColor(slot.data.darkColor);\n            }\n            light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);\n            dark.add((r2 - dark.r) * alpha, (g2 - dark.g) * alpha, (b2 - dark.b) * alpha, 0);\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class AttachmentTimeline implements Timeline {\n    slotIndex: number;\n    frames: ArrayLike<number>; // time, ...\n    attachmentNames: Array<string>;\n\n    constructor(frameCount: number) {\n        this.frames = Utils.newFloatArray(frameCount);\n        this.attachmentNames = new Array<string>(frameCount);\n    }\n\n    getPropertyId() {\n        return (TimelineType.attachment << 24) + this.slotIndex;\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time and value of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, attachmentName: string) {\n        this.frames[frameIndex] = time;\n        this.attachmentNames[frameIndex] = attachmentName;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (direction == MixDirection.mixOut && blend == MixBlend.setup) {\n            const attachmentName = slot.data.attachmentName;\n\n            slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));\n\n            return;\n        }\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            if (blend == MixBlend.setup || blend == MixBlend.first) {\n                const attachmentName = slot.data.attachmentName;\n\n                slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));\n            }\n\n            return;\n        }\n\n        let frameIndex = 0;\n\n        if (time >= frames[frames.length - 1])\n            // Time is after last frame.\n            frameIndex = frames.length - 1;\n        else frameIndex = Animation.binarySearch(frames, time, 1) - 1;\n\n        const attachmentName = this.attachmentNames[frameIndex];\n\n        skeleton.slots[this.slotIndex].setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));\n    }\n}\n\nlet zeros: ArrayLike<number> = null;\n\n/**\n * @public\n */\nexport class DeformTimeline extends CurveTimeline {\n    slotIndex: number;\n    attachment: VertexAttachment;\n    frames: ArrayLike<number>; // time, ...\n    frameVertices: Array<ArrayLike<number>>;\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount);\n        this.frameVertices = new Array<ArrayLike<number>>(frameCount);\n        if (zeros == null) zeros = Utils.newFloatArray(64);\n    }\n\n    getPropertyId() {\n        return (TimelineType.deform << 27) + Number(this.attachment.id) + this.slotIndex;\n    }\n\n    /** Sets the time of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, vertices: ArrayLike<number>) {\n        this.frames[frameIndex] = time;\n        this.frameVertices[frameIndex] = vertices;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot: Slot = skeleton.slots[this.slotIndex];\n        const slotAttachment: Attachment = slot.getAttachment();\n\n        if (!(slotAttachment instanceof VertexAttachment) || !(<VertexAttachment>slotAttachment).applyDeform(this.attachment)) return;\n\n        const verticesArray: Array<number> = slot.attachmentVertices;\n\n        if (verticesArray.length == 0) blend = MixBlend.setup;\n\n        const frameVertices = this.frameVertices;\n        const vertexCount = frameVertices[0].length;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            const vertexAttachment = <VertexAttachment>slotAttachment;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    verticesArray.length = 0;\n\n                    return;\n                case MixBlend.first:\n                    if (alpha == 1) {\n                        verticesArray.length = 0;\n                        break;\n                    }\n                    const vertices: Array<number> = Utils.setArraySize(verticesArray, vertexCount);\n\n                    if (vertexAttachment.bones == null) {\n                        // Unweighted vertex positions.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) vertices[i] += (setupVertices[i] - vertices[i]) * alpha;\n                    } else {\n                        // Weighted deform offsets.\n                        alpha = 1 - alpha;\n                        for (let i = 0; i < vertexCount; i++) vertices[i] *= alpha;\n                    }\n            }\n\n            return;\n        }\n\n        const vertices: Array<number> = Utils.setArraySize(verticesArray, vertexCount);\n\n        if (time >= frames[frames.length - 1]) {\n            // Time is after last frame.\n            const lastVertices = frameVertices[frames.length - 1];\n\n            if (alpha == 1) {\n                if (blend == MixBlend.add) {\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (vertexAttachment.bones == null) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) {\n                            vertices[i] += lastVertices[i] - setupVertices[i];\n                        }\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) vertices[i] += lastVertices[i];\n                    }\n                } else {\n                    Utils.arrayCopy(lastVertices, 0, vertices, 0, vertexCount);\n                }\n            } else {\n                switch (blend) {\n                    case MixBlend.setup: {\n                        const vertexAttachment = slotAttachment as VertexAttachment;\n\n                        if (vertexAttachment.bones == null) {\n                            // Unweighted vertex positions, with alpha.\n                            const setupVertices = vertexAttachment.vertices;\n\n                            for (let i = 0; i < vertexCount; i++) {\n                                const setup = setupVertices[i];\n\n                                vertices[i] = setup + (lastVertices[i] - setup) * alpha;\n                            }\n                        } else {\n                            // Weighted deform offsets, with alpha.\n                            for (let i = 0; i < vertexCount; i++) vertices[i] = lastVertices[i] * alpha;\n                        }\n                        break;\n                    }\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        for (let i = 0; i < vertexCount; i++) vertices[i] += (lastVertices[i] - vertices[i]) * alpha;\n                    case MixBlend.add:\n                        const vertexAttachment = slotAttachment as VertexAttachment;\n\n                        if (vertexAttachment.bones == null) {\n                            // Unweighted vertex positions, with alpha.\n                            const setupVertices = vertexAttachment.vertices;\n\n                            for (let i = 0; i < vertexCount; i++) {\n                                vertices[i] += (lastVertices[i] - setupVertices[i]) * alpha;\n                            }\n                        } else {\n                            // Weighted deform offsets, with alpha.\n                            for (let i = 0; i < vertexCount; i++) vertices[i] += lastVertices[i] * alpha;\n                        }\n                }\n            }\n\n            return;\n        }\n\n        // Interpolate between the previous frame and the current frame.\n        const frame = Animation.binarySearch(frames, time);\n        const prevVertices = frameVertices[frame - 1];\n        const nextVertices = frameVertices[frame];\n        const frameTime = frames[frame];\n        const percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime));\n\n        if (alpha == 1) {\n            if (blend == MixBlend.add) {\n                const vertexAttachment = slotAttachment as VertexAttachment;\n\n                if (vertexAttachment.bones == null) {\n                    // Unweighted vertex positions, with alpha.\n                    const setupVertices = vertexAttachment.vertices;\n\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        vertices[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];\n                    }\n                } else {\n                    // Weighted deform offsets, with alpha.\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        vertices[i] += prev + (nextVertices[i] - prev) * percent;\n                    }\n                }\n            } else {\n                for (let i = 0; i < vertexCount; i++) {\n                    const prev = prevVertices[i];\n\n                    vertices[i] = prev + (nextVertices[i] - prev) * percent;\n                }\n            }\n        } else {\n            switch (blend) {\n                case MixBlend.setup: {\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (vertexAttachment.bones == null) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n                            const setup = setupVertices[i];\n\n                            vertices[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;\n                        }\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            vertices[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;\n                        }\n                    }\n                    break;\n                }\n                case MixBlend.first:\n                case MixBlend.replace:\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        vertices[i] += (prev + (nextVertices[i] - prev) * percent - vertices[i]) * alpha;\n                    }\n                    break;\n                case MixBlend.add:\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (vertexAttachment.bones == null) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            vertices[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;\n                        }\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            vertices[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;\n                        }\n                    }\n            }\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class EventTimeline implements Timeline {\n    frames: ArrayLike<number>; // time, ...\n    events: Array<Event>;\n\n    constructor(frameCount: number) {\n        this.frames = Utils.newFloatArray(frameCount);\n        this.events = new Array<Event>(frameCount);\n    }\n\n    getPropertyId() {\n        return TimelineType.event << 24;\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time of the specified keyframe. */\n    setFrame(frameIndex: number, event: Event) {\n        this.frames[frameIndex] = event.time;\n        this.events[frameIndex] = event;\n    }\n\n    /** Fires events for frames > lastTime and <= time. */\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        if (firedEvents == null) return;\n        const frames = this.frames;\n        const frameCount = this.frames.length;\n\n        if (lastTime > time) {\n            // Fire events after last time for looped animations.\n            this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);\n            lastTime = -1;\n        } else if (lastTime >= frames[frameCount - 1])\n            // Last time is after last frame.\n            return;\n        if (time < frames[0]) return; // Time is before first frame.\n\n        let frame = 0;\n\n        if (lastTime < frames[0]) frame = 0;\n        else {\n            frame = Animation.binarySearch(frames, lastTime);\n            const frameTime = frames[frame];\n\n            while (frame > 0) {\n                // Fire multiple events with the same frame.\n                if (frames[frame - 1] != frameTime) break;\n                frame--;\n            }\n        }\n        for (; frame < frameCount && time >= frames[frame]; frame++) firedEvents.push(this.events[frame]);\n    }\n}\n\n/**\n * @public\n */\nexport class DrawOrderTimeline implements Timeline {\n    frames: ArrayLike<number>; // time, ...\n    drawOrders: Array<Array<number>>;\n\n    constructor(frameCount: number) {\n        this.frames = Utils.newFloatArray(frameCount);\n        this.drawOrders = new Array<Array<number>>(frameCount);\n    }\n\n    getPropertyId() {\n        return TimelineType.drawOrder << 24;\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time of the specified keyframe.\n     * @param drawOrder May be null to use bind pose draw order. */\n    setFrame(frameIndex: number, time: number, drawOrder: Array<number>) {\n        this.frames[frameIndex] = time;\n        this.drawOrders[frameIndex] = drawOrder;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const drawOrder: Array<Slot> = skeleton.drawOrder;\n        const slots: Array<Slot> = skeleton.slots;\n\n        if (direction == MixDirection.mixOut && blend == MixBlend.setup) {\n            Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\n            return;\n        }\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            if (blend == MixBlend.setup || blend == MixBlend.first) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\n            return;\n        }\n\n        let frame = 0;\n\n        if (time >= frames[frames.length - 1])\n            // Time is after last frame.\n            frame = frames.length - 1;\n        else frame = Animation.binarySearch(frames, time) - 1;\n\n        const drawOrderToSetupIndex = this.drawOrders[frame];\n\n        if (drawOrderToSetupIndex == null) Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length);\n        else {\n            for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++) drawOrder[i] = slots[drawOrderToSetupIndex[i]];\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class IkConstraintTimeline extends CurveTimeline {\n    static ENTRIES = 5;\n    static PREV_TIME = -5;\n    static PREV_MIX = -4;\n    static PREV_BEND_DIRECTION = -3;\n    static PREV_COMPRESS = -2;\n    static PREV_STRETCH = -1;\n    static MIX = 1;\n    static BEND_DIRECTION = 2;\n    static COMPRESS = 3;\n    static STRETCH = 4;\n\n    ikConstraintIndex: number;\n    frames: ArrayLike<number>; // time, mix, bendDirection, compress, stretch, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * IkConstraintTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.ikConstraint << 24) + this.ikConstraintIndex;\n    }\n\n    /** Sets the time, mix and bend direction of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, mix: number, bendDirection: number, compress: boolean, stretch: boolean) {\n        frameIndex *= IkConstraintTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + IkConstraintTimeline.MIX] = mix;\n        this.frames[frameIndex + IkConstraintTimeline.BEND_DIRECTION] = bendDirection;\n        this.frames[frameIndex + IkConstraintTimeline.COMPRESS] = compress ? 1 : 0;\n        this.frames[frameIndex + IkConstraintTimeline.STRETCH] = stretch ? 1 : 0;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n        const constraint: IkConstraint = skeleton.ikConstraints[this.ikConstraintIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.mix = constraint.data.mix;\n                    constraint.bendDirection = constraint.data.bendDirection;\n                    constraint.compress = constraint.data.compress;\n                    constraint.stretch = constraint.data.stretch;\n\n                    return;\n                case MixBlend.first:\n                    constraint.mix += (constraint.data.mix - constraint.mix) * alpha;\n                    constraint.bendDirection = constraint.data.bendDirection;\n                    constraint.compress = constraint.data.compress;\n                    constraint.stretch = constraint.data.stretch;\n            }\n\n            return;\n        }\n\n        if (time >= frames[frames.length - IkConstraintTimeline.ENTRIES]) {\n            // Time is after last frame.\n            if (blend == MixBlend.setup) {\n                constraint.mix = constraint.data.mix + (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.data.mix) * alpha;\n                if (direction == MixDirection.mixOut) {\n                    constraint.bendDirection = constraint.data.bendDirection;\n                    constraint.compress = constraint.data.compress;\n                    constraint.stretch = constraint.data.stretch;\n                } else {\n                    constraint.bendDirection = frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION];\n                    constraint.compress = frames[frames.length + IkConstraintTimeline.PREV_COMPRESS] != 0;\n                    constraint.stretch = frames[frames.length + IkConstraintTimeline.PREV_STRETCH] != 0;\n                }\n            } else {\n                constraint.mix += (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.mix) * alpha;\n                if (direction == MixDirection.mixIn) {\n                    constraint.bendDirection = frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION];\n                    constraint.compress = frames[frames.length + IkConstraintTimeline.PREV_COMPRESS] != 0;\n                    constraint.stretch = frames[frames.length + IkConstraintTimeline.PREV_STRETCH] != 0;\n                }\n            }\n\n            return;\n        }\n\n        // Interpolate between the previous frame and the current frame.\n        const frame = Animation.binarySearch(frames, time, IkConstraintTimeline.ENTRIES);\n        const mix = frames[frame + IkConstraintTimeline.PREV_MIX];\n        const frameTime = frames[frame];\n        const percent = this.getCurvePercent(frame / IkConstraintTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + IkConstraintTimeline.PREV_TIME] - frameTime));\n\n        if (blend == MixBlend.setup) {\n            constraint.mix = constraint.data.mix + (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.data.mix) * alpha;\n            if (direction == MixDirection.mixOut) {\n                constraint.bendDirection = constraint.data.bendDirection;\n                constraint.compress = constraint.data.compress;\n                constraint.stretch = constraint.data.stretch;\n            } else {\n                constraint.bendDirection = frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION];\n                constraint.compress = frames[frame + IkConstraintTimeline.PREV_COMPRESS] != 0;\n                constraint.stretch = frames[frame + IkConstraintTimeline.PREV_STRETCH] != 0;\n            }\n        } else {\n            constraint.mix += (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.mix) * alpha;\n            if (direction == MixDirection.mixIn) {\n                constraint.bendDirection = frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION];\n                constraint.compress = frames[frame + IkConstraintTimeline.PREV_COMPRESS] != 0;\n                constraint.stretch = frames[frame + IkConstraintTimeline.PREV_STRETCH] != 0;\n            }\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class TransformConstraintTimeline extends CurveTimeline {\n    static ENTRIES = 5;\n    static PREV_TIME = -5;\n    static PREV_ROTATE = -4;\n    static PREV_TRANSLATE = -3;\n    static PREV_SCALE = -2;\n    static PREV_SHEAR = -1;\n    static ROTATE = 1;\n    static TRANSLATE = 2;\n    static SCALE = 3;\n    static SHEAR = 4;\n\n    transformConstraintIndex: number;\n    frames: ArrayLike<number>; // time, rotate mix, translate mix, scale mix, shear mix, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * TransformConstraintTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.transformConstraint << 24) + this.transformConstraintIndex;\n    }\n\n    /** Sets the time and mixes of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, rotateMix: number, translateMix: number, scaleMix: number, shearMix: number) {\n        frameIndex *= TransformConstraintTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + TransformConstraintTimeline.ROTATE] = rotateMix;\n        this.frames[frameIndex + TransformConstraintTimeline.TRANSLATE] = translateMix;\n        this.frames[frameIndex + TransformConstraintTimeline.SCALE] = scaleMix;\n        this.frames[frameIndex + TransformConstraintTimeline.SHEAR] = shearMix;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n\n        const constraint: TransformConstraint = skeleton.transformConstraints[this.transformConstraintIndex];\n\n        if (time < frames[0]) {\n            const data = constraint.data;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.rotateMix = data.rotateMix;\n                    constraint.translateMix = data.translateMix;\n                    constraint.scaleMix = data.scaleMix;\n                    constraint.shearMix = data.shearMix;\n\n                    return;\n                case MixBlend.first:\n                    constraint.rotateMix += (data.rotateMix - constraint.rotateMix) * alpha;\n                    constraint.translateMix += (data.translateMix - constraint.translateMix) * alpha;\n                    constraint.scaleMix += (data.scaleMix - constraint.scaleMix) * alpha;\n                    constraint.shearMix += (data.shearMix - constraint.shearMix) * alpha;\n            }\n\n            return;\n        }\n\n        let rotate = 0;\n        let translate = 0;\n        let scale = 0;\n        let shear = 0;\n\n        if (time >= frames[frames.length - TransformConstraintTimeline.ENTRIES]) {\n            // Time is after last frame.\n            const i = frames.length;\n\n            rotate = frames[i + TransformConstraintTimeline.PREV_ROTATE];\n            translate = frames[i + TransformConstraintTimeline.PREV_TRANSLATE];\n            scale = frames[i + TransformConstraintTimeline.PREV_SCALE];\n            shear = frames[i + TransformConstraintTimeline.PREV_SHEAR];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, TransformConstraintTimeline.ENTRIES);\n\n            rotate = frames[frame + TransformConstraintTimeline.PREV_ROTATE];\n            translate = frames[frame + TransformConstraintTimeline.PREV_TRANSLATE];\n            scale = frames[frame + TransformConstraintTimeline.PREV_SCALE];\n            shear = frames[frame + TransformConstraintTimeline.PREV_SHEAR];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(\n                frame / TransformConstraintTimeline.ENTRIES - 1,\n                1 - (time - frameTime) / (frames[frame + TransformConstraintTimeline.PREV_TIME] - frameTime)\n            );\n\n            rotate += (frames[frame + TransformConstraintTimeline.ROTATE] - rotate) * percent;\n            translate += (frames[frame + TransformConstraintTimeline.TRANSLATE] - translate) * percent;\n            scale += (frames[frame + TransformConstraintTimeline.SCALE] - scale) * percent;\n            shear += (frames[frame + TransformConstraintTimeline.SHEAR] - shear) * percent;\n        }\n        if (blend == MixBlend.setup) {\n            const data = constraint.data;\n\n            constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha;\n            constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha;\n            constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha;\n            constraint.shearMix = data.shearMix + (shear - data.shearMix) * alpha;\n        } else {\n            constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;\n            constraint.translateMix += (translate - constraint.translateMix) * alpha;\n            constraint.scaleMix += (scale - constraint.scaleMix) * alpha;\n            constraint.shearMix += (shear - constraint.shearMix) * alpha;\n        }\n    }\n}\n\n/**\n * @public\n */\nexport class PathConstraintPositionTimeline extends CurveTimeline {\n    static ENTRIES = 2;\n    static PREV_TIME = -2;\n    static PREV_VALUE = -1;\n    static VALUE = 1;\n\n    pathConstraintIndex: number;\n\n    frames: ArrayLike<number>; // time, position, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * PathConstraintPositionTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.pathConstraintPosition << 24) + this.pathConstraintIndex;\n    }\n\n    /** Sets the time and value of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, value: number) {\n        frameIndex *= PathConstraintPositionTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + PathConstraintPositionTimeline.VALUE] = value;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.position = constraint.data.position;\n\n                    return;\n                case MixBlend.first:\n                    constraint.position += (constraint.data.position - constraint.position) * alpha;\n            }\n\n            return;\n        }\n\n        let position = 0;\n\n        if (time >= frames[frames.length - PathConstraintPositionTimeline.ENTRIES])\n            // Time is after last frame.\n            position = frames[frames.length + PathConstraintPositionTimeline.PREV_VALUE];\n        else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, PathConstraintPositionTimeline.ENTRIES);\n\n            position = frames[frame + PathConstraintPositionTimeline.PREV_VALUE];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(\n                frame / PathConstraintPositionTimeline.ENTRIES - 1,\n                1 - (time - frameTime) / (frames[frame + PathConstraintPositionTimeline.PREV_TIME] - frameTime)\n            );\n\n            position += (frames[frame + PathConstraintPositionTimeline.VALUE] - position) * percent;\n        }\n        if (blend == MixBlend.setup) constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;\n        else constraint.position += (position - constraint.position) * alpha;\n    }\n}\n\n/**\n * @public\n */\nexport class PathConstraintSpacingTimeline extends PathConstraintPositionTimeline {\n    constructor(frameCount: number) {\n        super(frameCount);\n    }\n\n    getPropertyId() {\n        return (TimelineType.pathConstraintSpacing << 24) + this.pathConstraintIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.spacing = constraint.data.spacing;\n\n                    return;\n                case MixBlend.first:\n                    constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;\n            }\n\n            return;\n        }\n\n        let spacing = 0;\n\n        if (time >= frames[frames.length - PathConstraintSpacingTimeline.ENTRIES])\n            // Time is after last frame.\n            spacing = frames[frames.length + PathConstraintSpacingTimeline.PREV_VALUE];\n        else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, PathConstraintSpacingTimeline.ENTRIES);\n\n            spacing = frames[frame + PathConstraintSpacingTimeline.PREV_VALUE];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(\n                frame / PathConstraintSpacingTimeline.ENTRIES - 1,\n                1 - (time - frameTime) / (frames[frame + PathConstraintSpacingTimeline.PREV_TIME] - frameTime)\n            );\n\n            spacing += (frames[frame + PathConstraintSpacingTimeline.VALUE] - spacing) * percent;\n        }\n\n        if (blend == MixBlend.setup) constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;\n        else constraint.spacing += (spacing - constraint.spacing) * alpha;\n    }\n}\n\n/**\n * @public\n */\nexport class PathConstraintMixTimeline extends CurveTimeline {\n    static ENTRIES = 3;\n    static PREV_TIME = -3;\n    static PREV_ROTATE = -2;\n    static PREV_TRANSLATE = -1;\n    static ROTATE = 1;\n    static TRANSLATE = 2;\n\n    pathConstraintIndex: number;\n\n    frames: ArrayLike<number>; // time, rotate mix, translate mix, ...\n\n    constructor(frameCount: number) {\n        super(frameCount);\n        this.frames = Utils.newFloatArray(frameCount * PathConstraintMixTimeline.ENTRIES);\n    }\n\n    getPropertyId() {\n        return (TimelineType.pathConstraintMix << 24) + this.pathConstraintIndex;\n    }\n\n    /** Sets the time and mixes of the specified keyframe. */\n    setFrame(frameIndex: number, time: number, rotateMix: number, translateMix: number) {\n        frameIndex *= PathConstraintMixTimeline.ENTRIES;\n        this.frames[frameIndex] = time;\n        this.frames[frameIndex + PathConstraintMixTimeline.ROTATE] = rotateMix;\n        this.frames[frameIndex + PathConstraintMixTimeline.TRANSLATE] = translateMix;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const frames = this.frames;\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.rotateMix = constraint.data.rotateMix;\n                    constraint.translateMix = constraint.data.translateMix;\n\n                    return;\n                case MixBlend.first:\n                    constraint.rotateMix += (constraint.data.rotateMix - constraint.rotateMix) * alpha;\n                    constraint.translateMix += (constraint.data.translateMix - constraint.translateMix) * alpha;\n            }\n\n            return;\n        }\n\n        let rotate = 0;\n        let translate = 0;\n\n        if (time >= frames[frames.length - PathConstraintMixTimeline.ENTRIES]) {\n            // Time is after last frame.\n            rotate = frames[frames.length + PathConstraintMixTimeline.PREV_ROTATE];\n            translate = frames[frames.length + PathConstraintMixTimeline.PREV_TRANSLATE];\n        } else {\n            // Interpolate between the previous frame and the current frame.\n            const frame = Animation.binarySearch(frames, time, PathConstraintMixTimeline.ENTRIES);\n\n            rotate = frames[frame + PathConstraintMixTimeline.PREV_ROTATE];\n            translate = frames[frame + PathConstraintMixTimeline.PREV_TRANSLATE];\n            const frameTime = frames[frame];\n            const percent = this.getCurvePercent(\n                frame / PathConstraintMixTimeline.ENTRIES - 1,\n                1 - (time - frameTime) / (frames[frame + PathConstraintMixTimeline.PREV_TIME] - frameTime)\n            );\n\n            rotate += (frames[frame + PathConstraintMixTimeline.ROTATE] - rotate) * percent;\n            translate += (frames[frame + PathConstraintMixTimeline.TRANSLATE] - translate) * percent;\n        }\n\n        if (blend == MixBlend.setup) {\n            constraint.rotateMix = constraint.data.rotateMix + (rotate - constraint.data.rotateMix) * alpha;\n            constraint.translateMix = constraint.data.translateMix + (translate - constraint.data.translateMix) * alpha;\n        } else {\n            constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;\n            constraint.translateMix += (translate - constraint.translateMix) * alpha;\n        }\n    }\n}\n"],"names":["TimelineType","r","attachmentName","vertices","vertexAttachment"],"mappings":"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"}