Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
animation.getKeys().forEach(function(keyFrame) {
inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.
_GLTFAnimation.AddSplineTangent(
babylonTransformNode,
_TangentType.INTANGENT,
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
convertToRightHandedSystem
);
_GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);
_GLTFAnimation.AddSplineTangent(
babylonTransformNode,
_TangentType.OUTTANGENT,
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
key = keyFrames[i];
if (key.inTangent || key.outTangent) {
if (interpolationType) {
if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;
}
}
else {
if (interpolationType) {
if (interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||
(key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP) && interpolationType !== AnimationSamplerInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
if (key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.STEP;
}
else {
interpolationType = AnimationSamplerInterpolation.LINEAR;
}
}
}
}
const minMaxKeyFrames = _GLTFAnimation.calculateMinMaxKeyFrames(keyFrames);
const interpolationOrBake = _GLTFAnimation._DeduceInterpolation(keyFrames, animationChannelTargetPath, useQuaternion);
const frameDelta = minMaxKeyFrames.max - minMaxKeyFrames.min;
const interpolation = interpolationOrBake.interpolationType;
const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;
if (shouldBakeAnimation) {
_GLTFAnimation._CreateBakedAnimation(babylonTransformNode, animation, animationChannelTargetPath, minMaxKeyFrames.min, minMaxKeyFrames.max, animation.framePerSecond, animationSampleRate, inputs, outputs, minMaxKeyFrames, convertToRightHandedSystem, useQuaternion);
}
else {
if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {
_GLTFAnimation._CreateLinearOrStepAnimation(babylonTransformNode, animation, animationChannelTargetPath, frameDelta, inputs, outputs, convertToRightHandedSystem, useQuaternion);
}
else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {
_GLTFAnimation._CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, frameDelta, inputs, outputs, convertToRightHandedSystem, useQuaternion);
}
else {
_GLTFAnimation._CreateBakedAnimation(babylonTransformNode, animation, animationChannelTargetPath, minMaxKeyFrames.min, minMaxKeyFrames.max, animation.framePerSecond, animationSampleRate, inputs, outputs, minMaxKeyFrames, convertToRightHandedSystem, useQuaternion);
}
}
if (inputs.length && outputs.length) {
const result: _IAnimationData = {
inputs: inputs,
outputs: outputs,
samplerInterpolation: interpolation,
inputsMin: shouldBakeAnimation ? minMaxKeyFrames.min : Tools.FloatRound(minMaxKeyFrames.min / animation.framePerSecond),
inputsMax: shouldBakeAnimation ? minMaxKeyFrames.max : Tools.FloatRound(minMaxKeyFrames.max / animation.framePerSecond)
};
case AnimationSamplerInterpolation.STEP: {
getNextKey = (frameIndex) => ({
frame: data.input[frameIndex],
value: getNextOutputValue(),
interpolation: AnimationKeyInterpolation.STEP
});
break;
}
case AnimationSamplerInterpolation.LINEAR: {
getNextKey = (frameIndex) => ({
frame: data.input[frameIndex],
value: getNextOutputValue()
});
break;
}
case AnimationSamplerInterpolation.CUBICSPLINE: {
getNextKey = (frameIndex) => ({
frame: data.input[frameIndex],
inTangent: getNextOutputValue(),
value: getNextOutputValue(),
outTangent: getNextOutputValue()
});
break;
}
}
const keys = new Array(data.input.length);
for (let frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
keys[frameIndex] = getNextKey!(frameIndex);
}
if (targetPath === "influence") {
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
convertToRightHandedSystem
);
_GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);
_GLTFAnimation.AddSplineTangent(
babylonTransformNode,
_TangentType.OUTTANGENT,
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
convertToRightHandedSystem
);
});
}
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {
return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };
}
for (let i = 0, length = keyFrames.length; i < length; ++i) {
key = keyFrames[i];
if (key.inTangent || key.outTangent) {
if (interpolationType) {
if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;
}
}
else {
if (interpolationType) {
if (interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||
(key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP) && interpolationType !== AnimationSamplerInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
if (key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.STEP;
}
else {
private _loadAnimationSamplerAsync(context: string, sampler: IAnimationSampler): Promise<_IAnimationSamplerData> {
if (sampler._data) {
return sampler._data;
}
const interpolation = sampler.interpolation || AnimationSamplerInterpolation.LINEAR;
switch (interpolation) {
case AnimationSamplerInterpolation.STEP:
case AnimationSamplerInterpolation.LINEAR:
case AnimationSamplerInterpolation.CUBICSPLINE: {
break;
}
default: {
throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);
}
}
const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);
const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);
sampler._data = Promise.all([
this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),
this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor)
]).then(([inputData, outputData]) => {
return {
input: inputData,
interpolation: interpolation,
private static _DeduceInterpolation(keyFrames: IAnimationKey[], animationChannelTargetPath: AnimationChannelTargetPath, useQuaternion: boolean): { interpolationType: AnimationSamplerInterpolation, shouldBakeAnimation: boolean } {
let interpolationType: AnimationSamplerInterpolation | undefined;
let shouldBakeAnimation = false;
let key: IAnimationKey;
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {
return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };
}
for (let i = 0, length = keyFrames.length; i < length; ++i) {
key = keyFrames[i];
if (key.inTangent || key.outTangent) {
if (interpolationType) {
if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;
}
}
else {
if (interpolationType) {
if (interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||
(key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP) && interpolationType !== AnimationSamplerInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {
return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };
}
for (let i = 0, length = keyFrames.length; i < length; ++i) {
key = keyFrames[i];
if (key.inTangent || key.outTangent) {
if (interpolationType) {
if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;
}
}
else {
if (interpolationType) {
if (interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||
(key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP) && interpolationType !== AnimationSamplerInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.LINEAR;
shouldBakeAnimation = true;
break;
}
}
else {
if (key.interpolation && (key.interpolation === AnimationKeyInterpolation.STEP)) {
interpolationType = AnimationSamplerInterpolation.STEP;
}
else {
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
convertToRightHandedSystem
);
_GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);
_GLTFAnimation.AddSplineTangent(
babylonTransformNode,
_TangentType.OUTTANGENT,
outputs,
animationChannelTargetPath,
AnimationSamplerInterpolation.CUBICSPLINE,
keyFrame,
frameDelta,
useQuaternion,
convertToRightHandedSystem
);
});
}