dmx-ts
Version:
A nodejs DMX library
131 lines • 11.4 kB
JavaScript
"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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