UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

86 lines (75 loc) 2.4 kB
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; // } // }