@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
61 lines • 4.84 kB
JavaScript
import { tgdEasingFunctionLinear } from "../easing-function/index.js";
/**
* Create an animation which is the chain of `animations`.
*/
export function tgdAnimChain(animations, options = {}) {
if (animations.length === 0) {
return {
action() { },
duration: 0,
};
}
const { intervals, duration } = computeIntervals(animations);
let previousAnimation = null;
let previousName = "???";
return {
...options,
duration,
onEnd() {
previousAnimation?.onEnd?.();
options.onEnd?.();
},
action(alpha) {
const t = alpha * duration;
for (const { animation, begin, end } of intervals) {
if (t >= begin && t <= end) {
if (previousAnimation && previousAnimation !== animation) {
previousAnimation.onEnd?.();
}
previousAnimation = animation;
const intervalAlpha = computeIntervalAlpha(t, begin, end, animation.delay);
if (intervalAlpha < 0 || intervalAlpha > 1)
return;
if (previousName !== animation.name) {
previousName = animation.name ?? "";
}
const easingFunction = animation.easingFunction ?? tgdEasingFunctionLinear;
animation.action(easingFunction(intervalAlpha));
return;
}
}
},
};
}
function computeIntervals(animations) {
const intervals = [];
let begin = 0;
let end = 0;
for (const animation of animations) {
const duration = animation.duration + (animation.delay ?? 0);
end = begin + duration;
intervals.push({ animation, begin, end });
begin += duration;
}
return { intervals, duration: end };
}
function computeIntervalAlpha(t, begin, end, delay = 0) {
const actualBegin = begin + delay;
const duration = end - actualBegin;
return (t - actualBegin) / duration;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvYW5pbWF0aW9uL2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDeEIsVUFBMEIsRUFDMUIsVUFLSyxFQUFFO0lBRVAsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU87WUFDSCxNQUFNLEtBQUksQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1NBQ2QsQ0FBQTtJQUNMLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzVELElBQUksaUJBQWlCLEdBQXdCLElBQUksQ0FBQTtJQUNqRCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFDeEIsT0FBTztRQUNILEdBQUcsT0FBTztRQUNWLFFBQVE7UUFDUixLQUFLO1lBQ0QsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQTtZQUM1QixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQTtRQUNyQixDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQWE7WUFDaEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQTtZQUMxQixLQUFLLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUN6QixJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN2RCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFBO29CQUMvQixDQUFDO29CQUNELGlCQUFpQixHQUFHLFNBQVMsQ0FBQTtvQkFDN0IsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUMxRSxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLENBQUM7d0JBQUUsT0FBTTtvQkFFbEQsSUFBSSxZQUFZLEtBQUssU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNsQyxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7b0JBQ3ZDLENBQUM7b0JBQ0QsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLGNBQWMsSUFBSSx1QkFBdUIsQ0FBQTtvQkFDMUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtvQkFDL0MsT0FBTTtnQkFDVixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7S0FDSixDQUFBO0FBQ0wsQ0FBQztBQVFELFNBQVMsZ0JBQWdCLENBQUMsVUFBMEI7SUFDaEQsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFBO0lBQ2hDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUNiLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUNYLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDNUQsR0FBRyxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUE7UUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUN6QyxLQUFLLElBQUksUUFBUSxDQUFBO0lBQ3JCLENBQUM7SUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUN2QyxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxDQUFTLEVBQUUsS0FBYSxFQUFFLEdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUE7SUFDbEMsT0FBTyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxRQUFRLENBQUE7QUFDdkMsQ0FBQyJ9