@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
86 lines (75 loc) • 2.4 kB
text/typescript
import {isArray} from '../Type';
import {ChannelData, KeyframeData} from './KeyframeCommon';
import {createKeyframeTangent, copyKeyframeTangent} from './KeyframeTangent';
export function createKeyframeData(): KeyframeData {
return {pos: 0, value: 0, in: {slope: 0, accel: 0}};
}
export function channelDataFromString(content: string, target: ChannelData[]) {
try {
let json = JSON.parse(content);
if (isArray(json)) {
let i = 0;
for (const targetSubElement of target) {
const jsonElement = json[i] || json[0];
copyChannelData(jsonElement, targetSubElement);
i++;
}
} else {
for (const targetSubElement of target) {
copyChannelData(json, targetSubElement);
}
}
} catch (e) {
console.warn('invalid channel data');
console.log(e);
console.log(target);
}
}
export function channelDataToString(data: ChannelData[]): string {
if (data.length == 1) {
return JSON.stringify(data[0]);
}
return JSON.stringify(data);
}
export function copyKeyframeData(src: KeyframeData, target: KeyframeData) {
target.pos = src.pos;
target.value = src.value;
copyKeyframeTangent(src.in, target.in);
if (src.out) {
if (!target.out) {
target.out = createKeyframeTangent();
}
copyKeyframeTangent(src.out, target.out);
} else {
delete target.out;
}
}
export function copyChannelData(src: ChannelData, target: ChannelData) {
target.interpolation = src.interpolation;
// remove non existing keys
target.keyframes.splice(src.keyframes.length, target.keyframes.length);
const srcKeyframes = src.keyframes;
let i = 0;
for (const srcKeyframe of srcKeyframes) {
let targetKeyframe = target.keyframes[i];
if (!targetKeyframe) {
targetKeyframe = createKeyframeData();
target.keyframes[i] = targetKeyframe;
}
copyKeyframeData(srcKeyframe, targetKeyframe);
i++;
}
}
// function copyChannelsData(src: ChannelsData, target: ChannelsData) {
// // const data: ChannelsData = {};
// const existingChannelNames = Object.keys(target);
// for (const channelName of existingChannelNames) {
// delete target[channelName];
// }
// const channelNames = Object.keys(src);
// for (const channelName of channelNames) {
// const targetChannelData: ChannelData = {keyframes: [], interpolation: src[channelName].interpolation};
// copyChannelData(src[channelName], targetChannelData);
// target[channelName] = targetChannelData;
// }
// }