UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

61 lines 4.84 kB
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