UNPKG

dmx-ts

Version:
131 lines 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Animation = void 0; const easing_1 = require("./easing"); class Animation { constructor(args = {}) { this.frameDelay = 1; this.animations = []; this.lastAnimation = 0; this.timeout = null; this.duration = 0; this.startTime = null; this.loops = args.loop || 1; this.currentLoop = 0; this.filter = args.filter; } add(to, duration = 0, options = {}) { options.easing = options.easing || 'linear'; this.animations.push({ to, options, start: this.duration, end: this.duration + duration, }); this.duration += duration; return this; } delay(duration) { this.add({}, duration); return this; } stop() { if (this.timeout) { clearTimeout(this.timeout); } } reset(startTime = new Date().getTime()) { this.startTime = startTime; this.lastAnimation = 0; } runNextLoop(universe, onFinish) { const runAnimationStep = () => { const now = new Date().getTime(); const elapsedTime = now - this.startTime; this.timeout = setTimeout(runAnimationStep, this.frameDelay); // Find the animation for the current point in time, the latest if multiple match let currentAnimation = this.lastAnimation; while (currentAnimation < this.animations.length && elapsedTime >= this.animations[currentAnimation].end) { currentAnimation++; } // Ensure final state of all newly completed animations have been set const completedAnimations = this.animations.slice(this.lastAnimation, currentAnimation); // Ensure future animations interpolate from the most recent state completedAnimations.forEach(completedAnimation => { delete completedAnimation.from; }); if (completedAnimations.length) { const completedAnimationStatesToSet = Object.assign({}, ...completedAnimations.map(a => a.to)); if (typeof this.filter === 'function') { this.filter(completedAnimationStatesToSet); } universe.update(completedAnimationStatesToSet, { origin: 'animation' }); } this.lastAnimation = currentAnimation; if (elapsedTime >= this.duration) { // This animation loop is complete this.currentLoop++; this.stop(); if (this.currentLoop >= this.loops) { // All loops complete if (onFinish) { onFinish(); } } else { // Run next loop this.reset(this.startTime + this.duration); this.runNextLoop(universe); } } else { // Set intermediate channel values during an animation const animation = this.animations[currentAnimation]; const easing = easing_1.ease[animation.options.easing]; const duration = animation.end - animation.start; const animationElapsedTime = elapsedTime - animation.start; if (!animation.from) { animation.from = {}; for (const k in animation.to) { animation.from[k] = universe === null || universe === void 0 ? void 0 : universe.get(Number(k)); } if (animation.options.from) { animation.from = Object.assign(animation.from, animation.options.from); } } if (duration) { const easeProgress = easing(Math.min(animationElapsedTime, duration), 0, 1, duration); const intermediateValues = {}; for (const k in animation.to) { const startValue = animation.from[k]; const endValue = animation.to[k]; intermediateValues[k] = Math.round(startValue + easeProgress * (endValue - startValue)); } if (typeof this.filter === 'function') { this.filter(intermediateValues); } universe.update(intermediateValues, { origin: 'animation' }); } } }; runAnimationStep(); return this; } run(universe, onFinish) { if (universe.interval) { // Optimisation to run animation updates at double the rate of driver updates using Nyquist's theorem this.frameDelay = universe.interval / 2; } this.reset(); this.currentLoop = 0; this.runNextLoop(universe, onFinish); } runLoop(universe, onFinish, loops = Infinity) { this.loops = loops; this.run(universe, onFinish); return this; } } exports.Animation = Animation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0FuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FBZ0M7QUFPaEMsTUFBYSxTQUFTO0lBV3BCLFlBQVksT0FBc0IsRUFBRTtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsR0FBRyxDQUFDLEVBQU8sRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFVBQWUsRUFBRTtRQUMxQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDO1FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ25CLEVBQUU7WUFDRixPQUFPO1lBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVE7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7UUFFMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQWdCO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFB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