{"version":3,"file":"AnimatorTimeline.mjs","sources":["../../src/animate/AnimatorTimeline.ts"],"sourcesContent":["import type { MovieClip } from './MovieClip';\nimport { Animator } from './Animator';\n\nconst pool: AnimatorTimeline[] = [];\n\n/**\n * Represents a single animation play.\n */\nexport class AnimatorTimeline\n{\n    /**\n     * Bound copy of update().\n     */\n    private _update: (instance: MovieClip) => (() => void | null);\n\n    /**\n     * Instance of clip to play.\n     * @readOnly\n     */\n    public instance: MovieClip;\n\n    /**\n     * `true` if the timeline is suppose to loop.\n     * @readOnly\n     */\n    public loop: boolean;\n\n    /**\n     * Frame number of the starting farme.\n     * @readOnly\n     */\n    public start: number;\n\n    /**\n     * Frame number of the ending frame.\n     * @readOnly\n     */\n    public end: number;\n\n    /**\n     * Callback called when completed (non-looping animation).\n     * @readOnly\n     */\n    public callback: () => void;\n\n    constructor()\n    {\n        this._update = this.update.bind(this);\n        this.init(null, 0, 0, false, null);\n    }\n\n    /**\n     * The pool of timelines to use\n     * @param instance\n     * @param start\n     * @param end\n     * @param loop\n     * @param callback\n     */\n    private init(instance: MovieClip, start: number, end: number, loop: boolean, callback: () => void): void\n    {\n        this.instance = instance;\n        this.loop = loop;\n        this.start = start;\n        this.end = end;\n        this.callback = callback;\n\n        if (instance)\n        {\n            // Prevent overshooting the end frame and looping back around:\n            instance.loop = false;\n            instance.gotoAndStop(start);\n            instance._beforeUpdate = this._update;\n        }\n    }\n\n    /**\n     * Don't use after this\n     * @private\n     */\n    destroy(): void\n    {\n        this.instance._beforeUpdate = null;\n        this.init(null, 0, 0, false, null);\n        AnimatorTimeline._pool.push(this);\n    }\n\n    /**\n     * Is the animation complete\n     * @param instance\n     * @return Callback to do after updateTimeline\n     * @private\n     */\n    update(instance: MovieClip): (() => void) | null\n    {\n        let completed: () => void;\n\n        if (instance.currentFrame >= this.end)\n        {\n            // In case we over-shoot the current frame becuase of low FPS\n            instance.currentFrame = this.end;\n\n            if (this.loop)\n            {\n                // Update timeline so we get actions at the end frame\n                instance._updateTimeline();\n                instance.gotoAndPlay(this.start);\n            }\n            else\n            {\n                instance.stop();\n                if (this.callback)\n                {\n                    completed = this.callback;\n                }\n                this.stop(); // cleanup timeline\n            }\n        }\n\n        return completed;\n    }\n\n    /**\n     * Stop the animation, cannot be reused.\n     */\n    stop(): void\n    {\n        Animator._internalStop(this);\n    }\n\n    /**\n     * The progress from 0 to 1 of the playback.\n     */\n    get progress(): number\n    {\n        const progress = (this.instance.currentFrame - this.start) / (this.end - this.start);\n\n        return Math.max(0, Math.min(1, progress)); // clamp\n    }\n\n    /**\n     * The pool of timelines to use\n     * @private\n     */\n    static get _pool(): AnimatorTimeline[]\n    {\n        return pool;\n    }\n\n    /**\n     * Create a new timeline\n     */\n    static create(instance: MovieClip, start: number, end: number, loop: boolean, callback: () => void): AnimatorTimeline\n    {\n        let timeline: AnimatorTimeline;\n\n        if (this._pool.length)\n        {\n            timeline = this._pool.pop();\n        }\n        else\n        {\n            timeline = new AnimatorTimeline();\n        }\n        timeline.init(instance, start, end, loop, callback);\n\n        return timeline;\n    }\n}\n"],"names":[],"mappings":"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"}