lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
39 lines • 1.78 kB
JavaScript
import { filterBoolean } from "@lincode/utils";
import { AnimationClip, BooleanKeyframeTrack, NumberKeyframeTrack } from "three";
import { INVERSE_STANDARD_FRAME } from "../../globals";
import { uuidMap } from "../../collections/idCollections";
import TimelineAudio from "../../display/TimelineAudio";
import createInternalSystem from "../utils/createInternalSystem";
const isBooleanFrameData = (values) => typeof values[0] === "boolean";
const isNumberFrameData = (values) => typeof values[0] === "number";
const framesToKeyframeTrack = (targetName, property, frames) => {
const keys = Object.keys(frames);
if (!keys.length)
return;
const values = Object.values(frames);
const name = targetName + "." + property;
const frameNums = keys.map((frameNum) => Number(frameNum) * INVERSE_STANDARD_FRAME);
if (isBooleanFrameData(values))
return new BooleanKeyframeTrack(name, frameNums, values);
if (isNumberFrameData(values))
return new NumberKeyframeTrack(name, frameNums, values);
};
export const configAnimationDataSystem = createInternalSystem("configAnimationDataSystem", {
effect: (self) => {
if (!self.data) {
self.$clip = self.$loadedClip;
return;
}
self.$clip = new AnimationClip(undefined, undefined, Object.entries(self.data)
.map(([uuid, tracks]) => {
const instance = uuidMap.get(uuid);
if (!instance || instance instanceof TimelineAudio)
return [];
return Object.entries(tracks)
.map(([property, frames]) => framesToKeyframeTrack(uuid, property, frames))
.filter(filterBoolean);
})
.flat());
}
});
//# sourceMappingURL=configAnimationDataSystem.js.map