{"version":3,"file":"Tween.mjs","sources":["../../src/animate/Tween.ts"],"sourcesContent":["import type { AnimateDisplayObject } from './DisplayObject';\nimport type { Graphics } from '@pixi/graphics';\nimport type { Sprite } from '@pixi/sprite';\n\nexport type EaseMethod = (input: number) => number;\n\n// NOTE ABOUT KEYS OF TweenProps: Use \"(myProps[key] as any) = myVal;\"\n// Typescript is unhelpful in this case: https://github.com/microsoft/TypeScript/issues/31663\nexport interface TweenProps\n{\n    x?: number;\n    y?: number;\n    sx?: number;\n    sy?: number;\n    kx?: number;\n    ky?: number;\n    r?: number;\n    a?: number;\n    t?: number;\n    v?: boolean;\n    c?: number[];\n    m?: Graphics | Sprite;\n    g?: any;\n    /** Eases for any of the tweenable properties, if published as a per-property ease */\n    e?: {[P in TweenablePropNames]?: EaseMethod | {n: string; s: number}};\n}\n\nexport type TweenablePropNames = keyof Omit<TweenProps, 'm' | 'g' | 'e' | 'v'>;\n\nexport interface TweenData\n{\n    d: number;\n    p: TweenProps;\n    e?: EaseMethod | {n: string; s: number};\n}\n\nexport interface KeyframeData extends TweenProps\n{\n    /** Not tweenable, but information about a tween that starts on this frame */\n    tw?: TweenData;\n}\n\n// standard tweening\nfunction lerpValue(start: number, end: number, t: number): number\n{\n    return start + ((end - start) * t);\n}\n\nconst PI = Math.PI;\nconst TWO_PI = PI * 2;\n\n// handle 355 -> 5 degrees only going through a 10 degree change instead of\n// the long way around\n// Math from http://stackoverflow.com/a/2708740\nfunction lerpRotation(start: number, end: number, t: number): number\n{\n    const difference = Math.abs(end - start);\n\n    if (difference > PI)\n    {\n        // We need to add on to one of the values.\n        if (end > start)\n        {\n            // We'll add it on to start...\n            start += TWO_PI;\n        }\n        else\n        {\n            // Add it on to end.\n            end += TWO_PI;\n        }\n    }\n\n    // Interpolate it.\n    const value = (start + ((end - start) * t));\n\n    // wrap to 0-2PI\n    /* if (value >= 0 && value <= TWO_PI)\n        return value;\n    return value % TWO_PI;*/\n\n    // just return, as it's faster\n    return value;\n}\n\n// handle 180 -> -170 degrees only going through a 10 degree change instead of\n// the long way around\n// Math from http://stackoverflow.com/a/2708740\n// We're assuming Skew values are always in the range -PI to PI\nfunction lerpSkew(start: number, end: number, t: number): number\n{\n    const difference = Math.abs(end - start);\n\n    if (difference > PI)\n    {\n        // We need to add on to one of the values.\n        if (end > start)\n        {\n            // We'll add it on to start...\n            start += TWO_PI;\n        }\n        else\n        {\n            // Add it on to end.\n            end += TWO_PI;\n        }\n    }\n\n    // Interpolate it.\n    const value = (start + ((end - start) * t));\n\n    // wrap to -PI to PI\n    if (value > PI) return value - TWO_PI;\n    if (value < -PI) return value + TWO_PI;\n\n    return value;\n}\n\n// split r, g, b into separate values for tweening\nfunction lerpTint(start: number, end: number, t: number): number\n{\n    // split start color into components\n    const sR = (start >> 16) & 0xFF;\n    const sG = (start >> 8) & 0xFF;\n    const sB = start & 0xFF;\n    // split end color into components\n    const eR = (end >> 16) & 0xFF;\n    const eG = (end >> 8) & 0xFF;\n    const eB = end & 0xFF;\n    // lerp red\n    let r = sR + ((eR - sR) * t);\n\n    // clamp red to valid values\n    if (r < 0) r = 0;\n    else if (r > 255) r = 255;\n    // lerp green\n    let g = sG + ((eG - sG) * t);\n\n    // clamp green to valid values\n    if (g < 0) g = 0;\n    else if (g > 255) g = 255;\n    // lerp blue\n    let b = sB + ((eB - sB) * t);\n\n    // clamp blue to valid values\n    if (b < 0) b = 0;\n    else if (b > 255) b = 255;\n\n    const combined = (r << 16) | (g << 8) | b;\n\n    return combined;\n}\n\nconst COLOR_HELPER: number[] = [];\n\nfunction lerpColor(start: number[], end: number[], t: number): number[]\n{\n    COLOR_HELPER[0] = start[0] + ((end[0] - start[0]) * t);\n    COLOR_HELPER[1] = start[1] + ((end[1] - start[1]) * t);\n    COLOR_HELPER[2] = start[2] + ((end[2] - start[2]) * t);\n    COLOR_HELPER[3] = start[3] + ((end[3] - start[3]) * t);\n    COLOR_HELPER[4] = start[4] + ((end[4] - start[4]) * t);\n    COLOR_HELPER[5] = start[5] + ((end[5] - start[5]) * t);\n\n    return COLOR_HELPER;\n}\n\nconst PROP_LERPS: {[P in keyof TweenProps]: (start: number, end: number, t: number) => number} = {\n    // position\n    x: lerpValue,\n    y: lerpValue,\n    // scale\n    sx: lerpValue,\n    sy: lerpValue,\n    // skew\n    kx: lerpSkew,\n    ky: lerpSkew,\n    // rotation\n    r: lerpRotation,\n    // alpha\n    a: lerpValue,\n    // tinting\n    t: lerpTint,\n    // values to be set\n    v: null, // visible\n    c: lerpColor as any, // colorTransform\n    m: null, // mask\n    g: null, // not sure if we'll actually handle graphics this way?\n};\n\nfunction setPropFromShorthand(target: AnimateDisplayObject, prop: keyof TweenProps, value: any): void\n{\n    switch (prop)\n    {\n        case 'x':\n            target.transform.position.x = value;\n            break;\n        case 'y':\n            target.transform.position.y = value;\n            break;\n        case 'sx':\n            target.transform.scale.x = value;\n            break;\n        case 'sy':\n            target.transform.scale.y = value;\n            break;\n        case 'kx':\n            target.transform.skew.x = value;\n            break;\n        case 'ky':\n            target.transform.skew.y = value;\n            break;\n        case 'r':\n            target.transform.rotation = value;\n            break;\n        case 'a':\n            target.alpha = value;\n            break;\n        case 't':\n            target.i(value); // i = setTint\n            break;\n        case 'c':\n            target.setColorTransform(...value as [number, number, number, number, number, number]); // c = setColorTransform\n            break;\n        case 'v':\n            target.visible = value;\n            break;\n        case 'm':\n            target.ma(value); // ma = setMask\n            break;\n    }\n}\n\n// builds an ease in function for a specific exponential power, i.e. quadratic easing is power 2 and cubic is 3\nfunction buildPowIn(power: number): EaseMethod\n{\n    return (t): number => Math.pow(t, power);\n}\n\n// builds an ease out function for a specific exponential power, i.e. quadratic easing is power 2 and cubic is 3\nfunction buildPowOut(power: number): EaseMethod\n{\n    return (t): number => 1 - Math.pow(1 - t, power);\n}\n\n// builds an ease in & out function for a specific exponential power, i.e. quadratic easing is power 2 and cubic is 3\nfunction buildPowInOut(power: number): EaseMethod\n{\n    return (t): number =>\n    {\n        if ((t *= 2) < 1) return 0.5 * Math.pow(t, power);\n\n        return 1 - (0.5 * Math.abs(Math.pow(2 - t, power)));\n    };\n}\nconst ELASTIC_AMPLITUDE = 1;\nconst ELASTIC_PERIOD = 0.3;\nconst ELASTIC_INOUT_PERIOD = 0.3 * 1.5;\n\nconst EASE_DICT: { [name: string]: EaseMethod } = {\n    quadIn: buildPowIn(2),\n    quadOut: buildPowOut(2),\n    quadInOut: buildPowInOut(2),\n    cubicIn: buildPowIn(3),\n    cubicOut: buildPowOut(3),\n    cubicInOut: buildPowInOut(3),\n    quartIn: buildPowIn(4),\n    quartOut: buildPowOut(4),\n    quartInOut: buildPowInOut(4),\n    quintIn: buildPowIn(5),\n    quintOut: buildPowOut(5),\n    quintInOut: buildPowInOut(5),\n    sineIn: (t) => 1 - Math.cos(t * PI / 2),\n    sineOut: (t) => Math.sin(t * PI / 2),\n    sineInOut: (t) => -0.5 * (Math.cos(PI * t) - 1),\n    backIn: (t) => t * t * (((1.7 + 1) * t) - 1.7),\n    backOut: (t) => (--t * t * (((1.7 + 1) * t) + 1.7)) + 1,\n    backInOut: (t) =>\n    {\n        const constVal = 1.7 * 1.525;\n\n        if ((t *= 2) < 1) return 0.5 * (t * t * (((constVal + 1) * t) - constVal));\n\n        return 0.5 * (((t -= 2) * t * (((constVal + 1) * t) + constVal)) + 2);\n    },\n    circIn: (t) => -(Math.sqrt(1 - (t * t)) - 1),\n    circOut: (t) => Math.sqrt(1 - ((--t) * t)),\n    circInOut: (t) =>\n    {\n        if ((t *= 2) < 1) return -0.5 * (Math.sqrt(1 - (t * t)) - 1);\n\n        return 0.5 * (Math.sqrt(1 - ((t -= 2) * t)) + 1);\n    },\n    bounceIn: (t) => 1 - EASE_DICT.bounceOut(1 - t),\n    bounceOut: (t) =>\n    {\n        if (t < 1 / 2.75)\n        {\n            return 7.5625 * t * t;\n        }\n        else if (t < 2 / 2.75)\n        {\n            return (7.5625 * (t -= 1.5 / 2.75) * t) + 0.75;\n        }\n        else if (t < 2.5 / 2.75)\n        {\n            return (7.5625 * (t -= 2.25 / 2.75) * t) + 0.9375;\n        }\n\n        return (7.5625 * (t -= 2.625 / 2.75) * t) + 0.984375;\n    },\n    // eslint-disable-next-line no-confusing-arrow\n    bounceInOut: (t) => t < 0.5 ? EASE_DICT.bounceIn(t * 2) * 0.5 : (EASE_DICT.bounceOut((t * 2) - 1) * 0.5) + 0.5,\n    elasticIn: (t) =>\n    {\n        if (t === 0 || t === 1) return t;\n        const s = ELASTIC_PERIOD / TWO_PI * Math.asin(1 / ELASTIC_AMPLITUDE);\n\n        return -(ELASTIC_AMPLITUDE * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TWO_PI / ELASTIC_PERIOD));\n    },\n    elasticOut: (t) =>\n    {\n        if (t === 0 || t === 1) return t;\n        const s = ELASTIC_PERIOD / TWO_PI * Math.asin(1 / ELASTIC_AMPLITUDE);\n\n        return (ELASTIC_AMPLITUDE * Math.pow(2, -10 * t) * Math.sin((t - s) * TWO_PI / ELASTIC_PERIOD)) + 1;\n    },\n    elasticInOut: (t) =>\n    {\n        const s = ELASTIC_INOUT_PERIOD / TWO_PI * Math.asin(1 / ELASTIC_AMPLITUDE);\n\n        if ((t *= 2) < 1)\n        {\n            return -0.5 * (ELASTIC_AMPLITUDE * Math.pow(2, 10 * (t -= 1))\n                * Math.sin((t - s) * TWO_PI / ELASTIC_INOUT_PERIOD));\n        }\n\n        return (ELASTIC_AMPLITUDE * Math.pow(2, -10 * (t -= 1))\n            * Math.sin((t - s) * TWO_PI / ELASTIC_INOUT_PERIOD) * 0.5) + 1;\n    },\n};\n\nexport function getEaseFromConfig(config: EaseMethod | { n: string; s: number }): EaseMethod | null\n{\n    if (!config) return null;\n    if (typeof config === 'function') return config;\n    // TODO: use config (name, strength) to determine an ease method\n    // In order to figure that out, we need to test out Animate's actual output values so we know what to use.\n\n    if (config.n === 'classic')\n    {\n        const s = config.s / 100;\n\n        // (s + 1)t + (-s)(t^2)\n        return (t: number): number => ((s + 1) * t) + ((-s) * t * t);\n    }\n\n    return EASE_DICT[config.n];\n}\n\n/**\n * Provides timeline playback of movieclip\n */\nexport class Tween\n{\n    /**\n     * Target display object.\n     */\n    public target: AnimateDisplayObject;\n    /**\n     * Properties at the start of the tween\n     */\n    public startProps: TweenProps;\n    /**\n     * Properties at the end of the tween, as well as any properties that are set\n     * instead of tweened\n     */\n    public endProps: TweenProps;\n    /**\n     * duration of tween in frames. A single-frame keyframe has a duration of 0.\n     */\n    public duration: number;\n    /**\n     * The frame that the tween starts on\n     */\n    public startFrame: number;\n    /**\n     * the frame that the tween ends on\n     */\n    public endFrame: number;\n    /**\n     * easing function to use, if any\n     */\n    public ease: {[P in TweenablePropNames]?: EaseMethod};\n    /**\n     * If we don't tween.\n     */\n    public isTweenlessFrame: boolean;\n\n    /**\n     * @param target - The target to play\n     * @param startProps - The starting properties\n     * @param endProps - The ending properties\n     * @param startFrame - frame number on which to begin tweening\n     * @param duration - Number of frames to tween\n     * @param ease - Ease function to use\n     */\n    constructor(target: AnimateDisplayObject,\n        startProps: TweenProps,\n        endProps: TweenProps | null,\n        startFrame: number,\n        duration: number,\n        ease?: EaseMethod)\n    {\n        this.target = target;\n        this.startProps = startProps;\n        this.endProps = {};\n        this.duration = duration;\n        this.startFrame = startFrame;\n        this.endFrame = startFrame + duration;\n        this.ease = {};\n        this.isTweenlessFrame = !endProps;\n\n        if (endProps)\n        {\n            // make a copy to safely include any unchanged values from the start of the tween\n            for (const prop in endProps)\n            {\n                if (prop === 'e') continue;\n                // read the end value\n                (this.endProps[prop as TweenablePropNames] as any) = endProps[prop as TweenablePropNames];\n                // if there is an ease for that property, use that\n                if (endProps.e?.[prop as TweenablePropNames])\n                {\n                    this.ease[prop as TweenablePropNames] = getEaseFromConfig(endProps.e[prop as TweenablePropNames]);\n                }\n                // otherwise use the global ease for this tween (if any)\n                else\n                {\n                    this.ease[prop as TweenablePropNames] = ease;\n                }\n            }\n        }\n\n        // copy in any starting properties don't change\n        for (const prop in startProps)\n        {\n            // eslint-disable-next-line no-prototype-builtins\n            if (!this.endProps.hasOwnProperty(prop))\n            {\n                (this.endProps[prop as keyof TweenProps] as any) = startProps[prop as keyof TweenProps];\n            }\n        }\n    }\n\n    /**\n     * Set the current frame.\n     */\n    public setPosition(currentFrame: number): void\n    {\n        // if this is a single frame with no tweening, or at the end of the tween, then\n        // just speed up the process by setting values\n        if (currentFrame >= this.endFrame)\n        {\n            this.setToEnd();\n\n            return;\n        }\n\n        if (this.isTweenlessFrame)\n        {\n            this.setToEnd();\n\n            return;\n        }\n\n        const time = (currentFrame - this.startFrame) / this.duration;\n\n        const target = this.target;\n        const startProps = this.startProps;\n        const endProps = this.endProps;\n\n        for (const prop in endProps)\n        {\n            const p = prop as keyof TweenProps;\n            const lerp = PROP_LERPS[p];\n            let lerpedTime = time;\n\n            if (this.ease[prop as TweenablePropNames])\n            {\n                lerpedTime = this.ease[prop as TweenablePropNames](time);\n            }\n\n            if (lerp)\n            {\n                setPropFromShorthand(target, p, lerp(startProps[p], endProps[p], lerpedTime));\n            }\n            else\n            {\n                setPropFromShorthand(target, p, startProps[p]);\n            }\n        }\n    }\n\n    /**\n     * Set to the end position\n     */\n    setToEnd(): void\n    {\n        const endProps = this.endProps;\n        const target = this.target;\n\n        for (const prop in endProps)\n        {\n            setPropFromShorthand(target, prop as keyof TweenProps, endProps[prop as keyof TweenProps]);\n        }\n    }\n}\n"],"names":[],"mappings":"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"}