You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.7 KiB
68 lines
2.7 KiB
const assert = require('assert');
|
|
|
|
const randomTransitionsSet = ['fade', 'fadegrayscale', 'directionalwarp', 'crosswarp', 'dreamyzoom', 'burn', 'crosszoom', 'simplezoom', 'linearblur', 'directional-left', 'directional-right', 'directional-up', 'directional-down'];
|
|
|
|
function getRandomTransition() {
|
|
return randomTransitionsSet[Math.floor(Math.random() * randomTransitionsSet.length)];
|
|
}
|
|
|
|
// https://easings.net/
|
|
|
|
function easeOutExpo(x) {
|
|
return x === 1 ? 1 : 1 - (2 ** (-10 * x));
|
|
}
|
|
|
|
function easeInOutCubic(x) {
|
|
return x < 0.5 ? 4 * x * x * x : 1 - ((-2 * x + 2) ** 3) / 2;
|
|
}
|
|
|
|
function getTransitionEasingFunction(easing, transitionName) {
|
|
if (easing !== null) {
|
|
if (easing) return { easeOutExpo }[easing];
|
|
if (transitionName === 'directional') return easeOutExpo;
|
|
}
|
|
return (progress) => progress;
|
|
}
|
|
|
|
function calcTransition(defaults, transition, isLastClip) {
|
|
if (transition === null || isLastClip) return { duration: 0 };
|
|
|
|
const getTransitionDefault = (key) => (defaults.transition && defaults.transition[key]);
|
|
|
|
let transitionOrDefault = {
|
|
name: (transition && transition.name) || getTransitionDefault('name'),
|
|
duration: (transition && transition.duration != null) ? transition.duration : getTransitionDefault('duration'),
|
|
params: (transition && transition.params) || getTransitionDefault('params'),
|
|
easing: (transition && transition.easing !== undefined) ? transition.easing : getTransitionDefault('easing'),
|
|
audioOutCurve: (transition && transition.audioOutCurve) || getTransitionDefault('audioOutCurve'),
|
|
audioInCurve: (transition && transition.audioInCurve) || getTransitionDefault('audioInCurve'),
|
|
};
|
|
|
|
assert(!transitionOrDefault.duration || transitionOrDefault.name, 'Please specify transition name or set duration to 0');
|
|
|
|
if (transitionOrDefault.name === 'random' && transitionOrDefault.duration) {
|
|
transitionOrDefault = { ...transitionOrDefault, name: getRandomTransition() };
|
|
}
|
|
|
|
const aliasedTransition = {
|
|
'directional-left': { name: 'directional', params: { direction: [1, 0] } },
|
|
'directional-right': { name: 'directional', params: { direction: [-1, 0] } },
|
|
'directional-down': { name: 'directional', params: { direction: [0, 1] } },
|
|
'directional-up': { name: 'directional', params: { direction: [0, -1] } },
|
|
}[transitionOrDefault.name];
|
|
if (aliasedTransition) {
|
|
transitionOrDefault = { ...transitionOrDefault, ...aliasedTransition };
|
|
}
|
|
|
|
return {
|
|
...transitionOrDefault,
|
|
duration: transitionOrDefault.duration || 0,
|
|
easingFunction: getTransitionEasingFunction(transitionOrDefault.easing, transitionOrDefault.name),
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
calcTransition,
|
|
easeInOutCubic,
|
|
easeOutExpo,
|
|
};
|