{"version":3,"file":"puxi-tween.mjs","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":["PIXI.utils","PIXI.Point"],"mappings":"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"}