@deck.gl/core
Version:
deck.gl core library
86 lines (72 loc) • 2.11 kB
text/typescript
// deck.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import {normalizeTransitionSettings} from './attribute/transition-settings';
import CPUInterpolationTransition from '../transitions/cpu-interpolation-transition';
import CPUSpringTransition from '../transitions/cpu-spring-transition';
import log from '../utils/log';
const TRANSITION_TYPES = {
interpolation: CPUInterpolationTransition,
spring: CPUSpringTransition
};
export default class UniformTransitionManager {
transitions = new Map();
timeline;
constructor(timeline) {
this.timeline = timeline;
}
get active() {
return this.transitions.size > 0;
}
add(key, fromValue, toValue, settings) {
const {transitions} = this;
if (transitions.has(key)) {
const transition = transitions.get(key);
// value may not be available if `update()` has not been called. Fallback to `fromValue`
const {value = transition.settings.fromValue} = transition;
// start from interrupted position
fromValue = value;
this.remove(key);
}
settings = normalizeTransitionSettings(settings);
if (!settings) {
return;
}
const TransitionType = TRANSITION_TYPES[settings.type];
if (!TransitionType) {
log.error(`unsupported transition type '${settings.type}'`)();
return;
}
const transition = new TransitionType(this.timeline);
transition.start({
...settings,
fromValue,
toValue
});
transitions.set(key, transition);
}
remove(key) {
const {transitions} = this;
if (transitions.has(key)) {
transitions.get(key).cancel();
transitions.delete(key);
}
}
update() {
const propsInTransition = {};
for (const [key, transition] of this.transitions) {
transition.update();
propsInTransition[key] = transition.value;
if (!transition.inProgress) {
// transition ended
this.remove(key);
}
}
return propsInTransition;
}
clear() {
for (const key of this.transitions.keys()) {
this.remove(key);
}
}
}