{"version":3,"file":"puxi-tween.min.js","sources":["../src/Tween.ts","../src/TweenManager.ts","../src/Ease.ts","../src/Interpolator.ts"],"sourcesContent":["import { Ease } from './Ease';\nimport { Erp } from './Interpolator';\nimport * as PIXI from 'pixi.js';\nimport { TweenManager } from './TweenManager';\n\nexport interface TweenTarget<T>\n{\n    [key: string]: T;\n}\n\n/**\n * Holds the information needed to perform a tweening operation. It is used internally\n * by `PUXI.tween.TweenManager`.\n *\n * @memberof PUXI.tween\n * @class\n * @template T\n */\nexport class Tween<T> extends PIXI.utils.EventEmitter\n{\n    startValue: T;\n    endValue: T;\n    erp: Erp<T>;\n    ease: Ease;\n\n    startTime: DOMHighResTimeStamp;\n    endTime: DOMHighResTimeStamp;\n\n    manager: TweenManager;\n    key: number;\n    observedValue: T;\n\n    autoCreated: boolean;\n\n    protected _repeat: number;\n    protected _flip: boolean;\n    protected _next: Tween<any>;\n\n    protected _target: TweenTarget<T>;\n    protected _observedProperty: string;\n\n    constructor( // eslint-disable-line max-params\n        manager?: TweenManager,\n        key?: number,\n        startValue?: T,\n        endValue?: T,\n        erp?: Erp<T>,\n        ease?: Ease,\n        observedValue?: T,\n        startTime?: DOMHighResTimeStamp,\n        endTime?: DOMHighResTimeStamp,\n        repeat = 1,\n        flip = true)\n    {\n        super();\n\n        /**\n         * The tween-manager whose update loop handles this tween.\n         * @member {PUXI.TweenManager}\n         */\n        this.manager = manager;\n\n        /**\n         * Unique id for this tweening operation\n         * @member {string}\n         */\n        this.key = key;\n\n        /**\n         * Start value of interpolation\n         * @member {T}\n         */\n        this.startValue = startValue;\n\n        /**\n         * End value of interpolation\n         * @member {T}\n         */\n        this.endValue = endValue;\n\n        /**\n         * Linear interpolator on tween property.\n         * @member {Erp}\n         */\n        this.erp = erp;\n\n        /**\n         * Easing function\n         * @member {Ease}\n         */\n        this.ease = ease;\n\n        /**\n         * Object that is observed and the interpolated value to be stored in.\n         * @member {T}\n         */\n        this.observedValue = observedValue;\n\n        /**\n         * @member {DOMHighResTimeStamp}\n         * @readonly\n         */\n        this.startTime = startTime;\n\n        /**\n         * @member {DOMHighResTimeStamp}\n         * @readonly\n         */\n        this.endTime = endTime;\n\n        this._repeat = repeat;\n        this._flip = flip;\n        this._next = null;\n        this._target = null;\n        this._observedProperty = null;\n\n        this.autoCreated = false;\n    }\n\n    /**\n     * Updates the observed value.\n     *\n     * @param {DOMHighResTimeStamp} t - current time\n     */\n    update(t: DOMHighResTimeStamp = performance.now()): void\n    {\n        t = (t - this.startTime) / (this.endTime - this.startTime);\n        t = Math.min(Math.max(t, 0), 1);\n\n        if (this.ease)\n        {\n            t = this.ease(t);\n        }\n\n        // Update observed value\n        this.observedValue = this.erp(\n            this.startValue,\n            this.endValue,\n            Math.min(Math.max(t, 0), 1),\n            this.observedValue,\n        );\n\n        // Emit update event\n        this.emit('update', this.observedValue, this.key);\n\n        // Update target object (if any)\n        if (this._target)\n        {\n            this._target[this._observedProperty] = this.observedValue;\n        }\n\n        // If cycle completed...\n        if (t >= 1)\n        {\n            --this._repeat;\n\n            this.emit('cycle', this);\n\n            // Repeat tween if required\n            if (this._repeat > 0)\n            {\n                if (this._flip)\n                {\n                    const { startValue: s, endValue: e } = this;\n\n                    this.endValue = s;\n                    this.startValue = e;\n                }\n\n                const duration = this.endTime - this.startTime;\n\n                this.startTime += duration;\n                this.endTime += duration;\n\n                return;\n            }\n\n            // Initiate chained tween\n            if (this._next)\n            {\n                this.manager.queue(this._next);\n            }\n\n            this.reset();\n\n            // Cleanup after completion\n            this.emit('complete', this);\n            this.removeAllListeners();\n        }\n    }\n\n    /**\n     * Configures this tween to update the observed-property on a tween target object\n     * each animation frame.\n     * @template T\n     * @param {PUXI.TweenTarget<T>} target - object on which property is being tweened\n     * @param {string} observedProperty - name of property on target\n     */\n    target(target: TweenTarget<T>, observedProperty: string): Tween<T>\n    {\n        this._target = target;\n        this._observedProperty = observedProperty;\n\n        return this;\n    }\n\n    /**\n     * Repeats this tween `repeat` no. of times again. If the tween is still running,\n     * then this is no. of times it will again (not added to the previous repeat\n     * count).\n     *\n     * Each time the tween is repeated, a `cycle` event is fired.\n     *\n     * By default, the repeat count of any tween is 1.\n     *\n     * @param {number} repeat - the repeat count\n     * @param {boolean}[flip=true] - whether to switch start/end values each cycle\n     * @returns {Tween<T>} - this tween, useful for method chaining\n     */\n    repeat(repeat: number, flip = true): Tween<T>\n    {\n        this._repeat = repeat;\n        this._flip = flip;\n\n        return this;\n    }\n\n    /**\n     * Chains a tween that will run after this one finishes.\n     *\n     * @template W\n     * @param {W} startValue\n     * @param {W} endValue\n     * @param {DOMHighResTimeStamp} duration\n     * @param {PUXI.Erp<W>} erp\n     * @param {PUXI.Ease}[ease]\n     */\n    chain<W>(startValue: W, endValue: W, duration: DOMHighResTimeStamp, erp: Erp<W>, ease: Ease): Tween<W>\n    {\n        const next = (Tween.pool.pop() || new Tween<W>()) as Tween<W>;\n\n        next.manager = this.manager;\n        next.key = 0;\n        next.startValue = startValue;\n        next.endValue = endValue;\n        next.startTime = this.endTime;\n        next.endTime = next.startTime + duration;\n        next.erp = erp;\n        next.ease = ease;\n\n        this._next = next;\n\n        return next;\n    }\n\n    /**\n     * Clears the tween's extra properties.\n     */\n    reset(): void\n    {\n        this.ease = null;\n        this._repeat = 0;\n        this._next = null;\n        this._target = null;\n        this._observedProperty = null;\n    }\n\n    /**\n     * Called when a tween is complete and no references to it are held. This\n     * will pool it (if auto-created).\n     *\n     * Custom tweens should override this.\n     */\n    destroy(): void\n    {\n        this.reset();\n\n        if (this.autoCreated)\n        {\n            Tween.pool.push(this);\n        }\n    }\n\n    /**\n     * Fired whenever the observed value is updated.\n     * @event update\n     * @param {T} observedValue\n     * @param {number} key\n     */\n\n    /**\n     * Fired whenever the tween has \"repeated\" once.\n     * @event cycle\n     * @param {Tween} cxt\n     */\n\n    /**\n     * Fired when tween has finished. References to this tween should be removed.\n     * @event complete\n     * @param {Tween} cxt\n     */\n\n    /**\n     * Used for pooling.\n     * @member {Array<TweenContext>}\n     * @static\n     */\n    static pool: Array<Tween<any>> = [];\n}\n","import { Tween } from './Tween';\nimport { Ease } from './Ease';\nimport { Erp } from './Interpolator';\nimport { Ticker } from 'pixi.js';\n\n// TODO: Prevent update loop from starting if there are no queued tweens.\n\nexport let nextTweenKey = 0;\n\n/**\n * @memberof PUXI.tween\n * @class\n */\nexport class TweenManager\n{\n    protected tweenMap: Map<number, Tween<any>>;\n\n    private isRunning: boolean;\n\n    constructor(autoStart = true)\n    {\n        this.tweenMap = new Map<number, Tween<any>>();\n\n        if (autoStart)\n        {\n            this.start();\n        }\n    }\n\n    /**\n     * Initiates a tween from `startValue` to `endValue` for the given duration\n     * using an interpolator.\n     *\n     * @template {T}\n     * @param {T} startValue - value of tween property at start\n     * @param {T} endValue - value of tween property at finish\n     * @param {DOMHighResTimeStamp | number} duration - duration of tween in milliseconds\n     * @param {PUXI.Erp<T>} erp - interpolator on tween property\n     * @param {PUXI.Ease}[ease] - easing function\n     */\n    tween<T>(\n        startValue: T,\n        endValue: T,\n        duration: DOMHighResTimeStamp,\n        erp: Erp<T>,\n        ease?: Ease,\n    ): Tween<T>\n    {\n        const tweenCxt = (Tween.pool.pop() || new Tween()) as Tween<T>;\n\n        tweenCxt.autoCreated = true;\n        tweenCxt.reset();\n\n        tweenCxt.manager = this;\n        tweenCxt.key = nextTweenKey++;\n        tweenCxt.startValue = startValue;\n        tweenCxt.endValue = endValue;\n        tweenCxt.erp = erp;\n        tweenCxt.ease = ease;\n        tweenCxt.startTime = performance.now();\n        tweenCxt.endTime = tweenCxt.startTime + duration;\n\n        this.tweenMap.set(tweenCxt.key, tweenCxt);\n        tweenCxt.on('complete', this.onTweenComplete);\n\n        return tweenCxt;\n    }\n\n    /**\n     * Queues the tween context so that it is updated every frame.\n     *\n     * @param {PUXI.Tween} context\n     * @returns {PUXI.TweenManager} this manager, useful for method chaining\n     */\n    queue(context: Tween<any>): TweenManager\n    {\n        context.key = nextTweenKey++;\n\n        this.tweenMap.set(context.key, context);\n        context.on('complete', this.onTweenComplete);\n\n        return this;\n    }\n\n    /**\n     * Starts the update loop.\n     */\n    start(): void\n    {\n        if (this.isRunning)\n        {\n            return;\n        }\n\n        Ticker.shared.add(this.onUpdate);\n        this.isRunning = true;\n    }\n\n    /**\n     * Stops the update loop. This will prevent tweens from getting updated.\n     */\n    stop(): void\n    {\n        if (!this.isRunning)\n        {\n            return;\n        }\n\n        Ticker.shared.remove(this.onUpdate);\n        this.isRunning = false;\n    }\n\n    onUpdate = (): void =>\n    {\n        for (const [, cxt] of this.tweenMap)\n        {\n            cxt.update();\n        }\n    };\n\n    protected onTweenComplete = (cxt: Tween<any>): void =>\n    {\n        this.tweenMap.delete(cxt.key);\n\n        cxt.destroy();\n    };\n}\n","export type Ease = (t: number) => number;\n\n/**\n * @memberof PUXI\n * @typedef {Function} Ease\n * @param {number} t - interpolation parameter (b/w 0 and 1) that increases linearly\n * @returns {numeber} - output interpolation parameter (b/w 0 and 1)\n */\n\n/**\n * Quadratic ease-in\n *\n * @memberof PUXI\n * @type Ease\n * @param {number} t\n * @returns {number}\n */\nexport const EaseIn: Ease = (t: number) => t * t;\n\n/**\n * Quadratic ease-out\n *\n * @memberof PUXI\n * @type Ease\n * @param {number} t\n * @returns {number}\n */\nexport const EaseOut: Ease = (t: number) => (1 - t) * (1 - t);\n\n/**\n * Quadratic ease-in & ease-out mixed!\n *\n * @memberof PUXI\n * @type Ease\n * @param {number} t\n * @returns {number}\n */\nexport const EaseBoth: Ease = (t: number) => ((t <= 0.5)\n    ? 2 * t * t\n    : ((2 * ((t - 0.5) * (1.5 - t))) + 0.5));\n","import * as PIXI from 'pixi.js';\n\nexport type Erp<T> = (startValue: T, endValue: T, t: number, observedValue?: T) => T;\n\n/**\n * Defines a (linear) interpolator on a type `T`.\n *\n * @memberof PUXI\n * @typedef {Function} Erp\n * @template T\n * @param {T} startValue\n * @param {T} endValue\n * @param {number} t - interpolation parameter between 0 and 1\n * @param {T}[observedValue]\n */\n\n/**\n * Interpolation function for number properties like alpha, rotation, component\n * position/scale/skew, elevation, etc.\n *\n * @memberof PUXI\n * @extends PUXI.Erp<number>\n * @param {number} startValue\n * @param {number} endValue\n * @param {number} t\n */\nexport const NumberErp: Erp<number> = (startValue: number, endValue: number, t: number) =>\n    ((1 - t) * startValue) + (t * endValue);\n\n/**\n * Interpolation function for 2D vector properties like position, scale, skew, etc.\n *\n * @memberof PUXI\n * @extends PUXI.Erp<PIXI.Point>\n * @param {PIXI.Point} startValue\n * @param {PIXI.Point} endValue\n * @param {number} t\n * @param {PIXI.Point} observedValue\n */\nexport const PointErp: Erp<PIXI.Point> = (\n    startValue: PIXI.Point,\n    endValue: PIXI.Point,\n    t: number,\n    observedValue: PIXI.Point,\n): PIXI.Point =>\n{\n    if (!observedValue)\n    {\n        observedValue = new PIXI.Point();\n    }\n\n    observedValue.x = ((1 - t) * startValue.x) + (t * endValue.x);\n    observedValue.y = ((1 - t) * startValue.y) + (t * endValue.y);\n\n    return observedValue;\n};\n\n"],"names":["Tween","PIXI.utils","EventEmitter","[object Object]","manager","key","startValue","endValue","erp","ease","observedValue","startTime","endTime","repeat","flip","super","this","_repeat","_flip","_next","_target","_observedProperty","autoCreated","t","performance","now","Math","min","max","emit","s","e","duration","queue","reset","removeAllListeners","target","observedProperty","next","pool","pop","push","PIXI.Point","x","y","autoStart","cxt","tweenMap","update","delete","destroy","Map","start","tweenCxt","nextTweenKey","set","on","onTweenComplete","context","isRunning","Ticker","shared","add","onUpdate","remove"],"mappings":";;;;;;;6GAkBaA,UAAiBC,QAAWC,aAuBrCC,YACIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAS,EACTC,GAAO,GAEPC,QAMAC,KAAKZ,QAAUA,EAMfY,KAAKX,IAAMA,EAMXW,KAAKV,WAAaA,EAMlBU,KAAKT,SAAWA,EAMhBS,KAAKR,IAAMA,EAMXQ,KAAKP,KAAOA,EAMZO,KAAKN,cAAgBA,EAMrBM,KAAKL,UAAYA,EAMjBK,KAAKJ,QAAUA,EAEfI,KAAKC,QAAUJ,EACfG,KAAKE,MAAQJ,EACbE,KAAKG,MAAQ,KACbH,KAAKI,QAAU,KACfJ,KAAKK,kBAAoB,KAEzBL,KAAKM,aAAc,EAQvBnB,OAAOoB,EAAyBC,YAAYC,OA4BxC,GA1BAF,GAAKA,EAAIP,KAAKL,YAAcK,KAAKJ,QAAUI,KAAKL,WAChDY,EAAIG,KAAKC,IAAID,KAAKE,IAAIL,EAAG,GAAI,GAEzBP,KAAKP,OAELc,EAAIP,KAAKP,KAAKc,IAIlBP,KAAKN,cAAgBM,KAAKR,IACtBQ,KAAKV,WACLU,KAAKT,SACLmB,KAAKC,IAAID,KAAKE,IAAIL,EAAG,GAAI,GACzBP,KAAKN,eAITM,KAAKa,KAAK,SAAUb,KAAKN,cAAeM,KAAKX,KAGzCW,KAAKI,UAELJ,KAAKI,QAAQJ,KAAKK,mBAAqBL,KAAKN,eAI5Ca,GAAK,EACT,CAMI,KALEP,KAAKC,QAEPD,KAAKa,KAAK,QAASb,MAGfA,KAAKC,QAAU,EACnB,CACI,GAAID,KAAKE,MACT,CACI,MAAQZ,WAAYwB,EAAGvB,SAAUwB,GAAMf,KAEvCA,KAAKT,SAAWuB,EAChBd,KAAKV,WAAayB,EAGtB,MAAMC,EAAWhB,KAAKJ,QAAUI,KAAKL,UAKrC,OAHAK,KAAKL,WAAaqB,OAClBhB,KAAKJ,SAAWoB,GAMhBhB,KAAKG,OAELH,KAAKZ,QAAQ6B,MAAMjB,KAAKG,OAG5BH,KAAKkB,QAGLlB,KAAKa,KAAK,WAAYb,MACtBA,KAAKmB,sBAWbhC,OAAOiC,EAAwBC,GAK3B,OAHArB,KAAKI,QAAUgB,EACfpB,KAAKK,kBAAoBgB,EAElBrB,KAgBXb,OAAOU,EAAgBC,GAAO,GAK1B,OAHAE,KAAKC,QAAUJ,EACfG,KAAKE,MAAQJ,EAENE,KAaXb,MAASG,EAAeC,EAAayB,EAA+BxB,EAAaC,GAE7E,MAAM6B,EAAQtC,EAAMuC,KAAKC,OAAS,IAAIxC,EAatC,OAXAsC,EAAKlC,QAAUY,KAAKZ,QACpBkC,EAAKjC,IAAM,EACXiC,EAAKhC,WAAaA,EAClBgC,EAAK/B,SAAWA,EAChB+B,EAAK3B,UAAYK,KAAKJ,QACtB0B,EAAK1B,QAAU0B,EAAK3B,UAAYqB,EAChCM,EAAK9B,IAAMA,EACX8B,EAAK7B,KAAOA,EAEZO,KAAKG,MAAQmB,EAENA,EAMXnC,QAEIa,KAAKP,KAAO,KACZO,KAAKC,QAAU,EACfD,KAAKG,MAAQ,KACbH,KAAKI,QAAU,KACfJ,KAAKK,kBAAoB,KAS7BlB,UAEIa,KAAKkB,QAEDlB,KAAKM,aAELtB,EAAMuC,KAAKE,KAAKzB,OA4BjBhB,OAA0B,kBC5SX,oBC8BKuB,GAAgBA,GAAK,GAC9C,EAAIA,EAAIA,GACAA,EAAI,KAAQ,IAAMA,GAAxB,EAA+B,YAtBVA,GAAcA,EAAIA,YAUjBA,IAAe,EAAIA,IAAM,EAAIA,eCDrB,CAACjB,EAAoBC,EAAkBgB,KACvE,EAAIA,GAAKjB,EAAeiB,EAAIhB,aAYO,CACrCD,EACAC,EACAgB,EACAb,KAGKA,IAEDA,EAAgB,IAAIgC,SAGxBhC,EAAciC,GAAM,EAAIpB,GAAKjB,EAAWqC,EAAMpB,EAAIhB,EAASoC,EAC3DjC,EAAckC,GAAM,EAAIrB,GAAKjB,EAAWsC,EAAMrB,EAAIhB,EAASqC,EAEpDlC,kCFnCPP,YAAY0C,GAAY,GA6FxB7B,cAAW,KAEP,IAAK,OAAS8B,KAAQ9B,KAAK+B,SAEvBD,EAAIE,UAIFhC,qBAAmB8B,IAEzB9B,KAAK+B,SAASE,OAAOH,EAAIzC,KAEzByC,EAAII,WAvGJlC,KAAK+B,SAAW,IAAII,IAEhBN,GAEA7B,KAAKoC,QAebjD,MACIG,EACAC,EACAyB,EACAxB,EACAC,GAGA,MAAM4C,EAAYrD,EAAMuC,KAAKC,OAAS,IAAIxC,EAiB1C,OAfAqD,EAAS/B,aAAc,EACvB+B,EAASnB,QAETmB,EAASjD,QAAUY,KACnBqC,EAAShD,IAAMiD,iBACfD,EAAS/C,WAAaA,EACtB+C,EAAS9C,SAAWA,EACpB8C,EAAS7C,IAAMA,EACf6C,EAAS5C,KAAOA,EAChB4C,EAAS1C,UAAYa,YAAYC,MACjC4B,EAASzC,QAAUyC,EAAS1C,UAAYqB,EAExChB,KAAK+B,SAASQ,IAAIF,EAAShD,IAAKgD,GAChCA,EAASG,GAAG,WAAYxC,KAAKyC,iBAEtBJ,EASXlD,MAAMuD,GAOF,OALAA,EAAQrD,IAAMiD,iBAEdtC,KAAK+B,SAASQ,IAAIG,EAAQrD,IAAKqD,GAC/BA,EAAQF,GAAG,WAAYxC,KAAKyC,iBAErBzC,KAMXb,QAEQa,KAAK2C,YAKTC,SAAOC,OAAOC,IAAI9C,KAAK+C,UACvB/C,KAAK2C,WAAY,GAMrBxD,OAESa,KAAK2C,YAKVC,SAAOC,OAAOG,OAAOhD,KAAK+C,UAC1B/C,KAAK2C,WAAY"}