@onerjs/serializers 8.23.5 → 8.23.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/glTF/2.0/glTFAnimation.js +224 -87
- package/glTF/2.0/glTFAnimation.js.map +1 -1
- package/package.json +2 -2
|
@@ -17,11 +17,11 @@ var _TangentType;
|
|
|
17
17
|
/**
|
|
18
18
|
* Specifies that input tangents are used.
|
|
19
19
|
*/
|
|
20
|
-
_TangentType[_TangentType["INTANGENT"] = 0] = "INTANGENT";
|
|
20
|
+
_TangentType[(_TangentType["INTANGENT"] = 0)] = "INTANGENT";
|
|
21
21
|
/**
|
|
22
22
|
* Specifies that output tangents are used.
|
|
23
23
|
*/
|
|
24
|
-
_TangentType[_TangentType["OUTTANGENT"] = 1] = "OUTTANGENT";
|
|
24
|
+
_TangentType[(_TangentType["OUTTANGENT"] = 1)] = "OUTTANGENT";
|
|
25
25
|
})(_TangentType || (_TangentType = {}));
|
|
26
26
|
/**
|
|
27
27
|
* @internal
|
|
@@ -56,17 +56,38 @@ export class _GLTFAnimation {
|
|
|
56
56
|
const interpolation = interpolationOrBake.interpolationType;
|
|
57
57
|
const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;
|
|
58
58
|
if (shouldBakeAnimation) {
|
|
59
|
-
_GLTFAnimation._CreateBakedAnimation(
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
_GLTFAnimation._CreateBakedAnimation(
|
|
60
|
+
babylonTransformNode,
|
|
61
|
+
animation,
|
|
62
|
+
animationChannelTargetPath,
|
|
63
|
+
minMaxKeyFrames.min,
|
|
64
|
+
minMaxKeyFrames.max,
|
|
65
|
+
animation.framePerSecond,
|
|
66
|
+
animationSampleRate,
|
|
67
|
+
inputs,
|
|
68
|
+
outputs,
|
|
69
|
+
minMaxKeyFrames,
|
|
70
|
+
useQuaternion
|
|
71
|
+
);
|
|
72
|
+
} else {
|
|
62
73
|
if (interpolation === "LINEAR" /* AnimationSamplerInterpolation.LINEAR */ || interpolation === "STEP" /* AnimationSamplerInterpolation.STEP */) {
|
|
63
74
|
_GLTFAnimation._CreateLinearOrStepAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);
|
|
64
|
-
}
|
|
65
|
-
else if (interpolation === "CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */) {
|
|
75
|
+
} else if (interpolation === "CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */) {
|
|
66
76
|
_GLTFAnimation._CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
77
|
+
} else {
|
|
78
|
+
_GLTFAnimation._CreateBakedAnimation(
|
|
79
|
+
babylonTransformNode,
|
|
80
|
+
animation,
|
|
81
|
+
animationChannelTargetPath,
|
|
82
|
+
minMaxKeyFrames.min,
|
|
83
|
+
minMaxKeyFrames.max,
|
|
84
|
+
animation.framePerSecond,
|
|
85
|
+
animationSampleRate,
|
|
86
|
+
inputs,
|
|
87
|
+
outputs,
|
|
88
|
+
minMaxKeyFrames,
|
|
89
|
+
useQuaternion
|
|
90
|
+
);
|
|
70
91
|
}
|
|
71
92
|
}
|
|
72
93
|
if (inputs.length && outputs.length) {
|
|
@@ -84,7 +105,7 @@ export class _GLTFAnimation {
|
|
|
84
105
|
}
|
|
85
106
|
static _DeduceAnimationInfo(animation) {
|
|
86
107
|
let animationChannelTargetPath = null;
|
|
87
|
-
let dataAccessorType = "VEC3" /* AccessorType.VEC3
|
|
108
|
+
let dataAccessorType = "VEC3"; /* AccessorType.VEC3 */
|
|
88
109
|
let useQuaternion = false;
|
|
89
110
|
const property = animation.targetProperty.split(".");
|
|
90
111
|
switch (property[0]) {
|
|
@@ -118,8 +139,7 @@ export class _GLTFAnimation {
|
|
|
118
139
|
}
|
|
119
140
|
if (animationChannelTargetPath) {
|
|
120
141
|
return { animationChannelTargetPath: animationChannelTargetPath, dataAccessorType: dataAccessorType, useQuaternion: useQuaternion };
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
142
|
+
} else {
|
|
123
143
|
Tools.Error("animation channel target path and data accessor type could be deduced");
|
|
124
144
|
}
|
|
125
145
|
return null;
|
|
@@ -137,7 +157,19 @@ export class _GLTFAnimation {
|
|
|
137
157
|
* @param accessors
|
|
138
158
|
* @param animationSampleRate
|
|
139
159
|
*/
|
|
140
|
-
static _CreateNodeAnimationFromNodeAnimations(
|
|
160
|
+
static _CreateNodeAnimationFromNodeAnimations(
|
|
161
|
+
babylonNode,
|
|
162
|
+
runtimeGLTFAnimation,
|
|
163
|
+
idleGLTFAnimations,
|
|
164
|
+
nodeMap,
|
|
165
|
+
nodes,
|
|
166
|
+
bufferManager,
|
|
167
|
+
bufferViews,
|
|
168
|
+
accessors,
|
|
169
|
+
animationSampleRate,
|
|
170
|
+
useRightHanded,
|
|
171
|
+
shouldExportAnimation
|
|
172
|
+
) {
|
|
141
173
|
let glTFAnimation;
|
|
142
174
|
if (_GLTFAnimation._IsTransformable(babylonNode)) {
|
|
143
175
|
if (babylonNode.animations) {
|
|
@@ -152,7 +184,21 @@ export class _GLTFAnimation {
|
|
|
152
184
|
samplers: [],
|
|
153
185
|
channels: [],
|
|
154
186
|
};
|
|
155
|
-
_GLTFAnimation._AddAnimation(
|
|
187
|
+
_GLTFAnimation._AddAnimation(
|
|
188
|
+
`${animation.name}`,
|
|
189
|
+
animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,
|
|
190
|
+
babylonNode,
|
|
191
|
+
animation,
|
|
192
|
+
animationInfo.dataAccessorType,
|
|
193
|
+
animationInfo.animationChannelTargetPath,
|
|
194
|
+
nodeMap,
|
|
195
|
+
bufferManager,
|
|
196
|
+
bufferViews,
|
|
197
|
+
accessors,
|
|
198
|
+
animationInfo.useQuaternion,
|
|
199
|
+
animationSampleRate,
|
|
200
|
+
useRightHanded
|
|
201
|
+
);
|
|
156
202
|
if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {
|
|
157
203
|
idleGLTFAnimations.push(glTFAnimation);
|
|
158
204
|
}
|
|
@@ -174,7 +220,19 @@ export class _GLTFAnimation {
|
|
|
174
220
|
* @param accessors
|
|
175
221
|
* @param animationSampleRate
|
|
176
222
|
*/
|
|
177
|
-
static _CreateMorphTargetAnimationFromMorphTargetAnimations(
|
|
223
|
+
static _CreateMorphTargetAnimationFromMorphTargetAnimations(
|
|
224
|
+
babylonNode,
|
|
225
|
+
runtimeGLTFAnimation,
|
|
226
|
+
idleGLTFAnimations,
|
|
227
|
+
nodeMap,
|
|
228
|
+
nodes,
|
|
229
|
+
bufferManager,
|
|
230
|
+
bufferViews,
|
|
231
|
+
accessors,
|
|
232
|
+
animationSampleRate,
|
|
233
|
+
useRightHanded,
|
|
234
|
+
shouldExportAnimation
|
|
235
|
+
) {
|
|
178
236
|
let glTFAnimation;
|
|
179
237
|
if (babylonNode instanceof Mesh) {
|
|
180
238
|
const morphTargetManager = babylonNode.morphTargetManager;
|
|
@@ -185,7 +243,14 @@ export class _GLTFAnimation {
|
|
|
185
243
|
if (shouldExportAnimation && !shouldExportAnimation(animation)) {
|
|
186
244
|
continue;
|
|
187
245
|
}
|
|
188
|
-
const combinedAnimation = new Animation(
|
|
246
|
+
const combinedAnimation = new Animation(
|
|
247
|
+
`${animation.name}`,
|
|
248
|
+
"influence",
|
|
249
|
+
animation.framePerSecond,
|
|
250
|
+
animation.dataType,
|
|
251
|
+
animation.loopMode,
|
|
252
|
+
animation.enableBlending
|
|
253
|
+
);
|
|
189
254
|
const combinedAnimationKeys = [];
|
|
190
255
|
const animationKeys = animation.getKeys();
|
|
191
256
|
for (let j = 0; j < animationKeys.length; ++j) {
|
|
@@ -193,8 +258,7 @@ export class _GLTFAnimation {
|
|
|
193
258
|
for (let k = 0; k < morphTargetManager.numTargets; ++k) {
|
|
194
259
|
if (k == i) {
|
|
195
260
|
combinedAnimationKeys.push(animationKey);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
261
|
+
} else {
|
|
198
262
|
combinedAnimationKeys.push({ frame: animationKey.frame, value: 0 });
|
|
199
263
|
}
|
|
200
264
|
}
|
|
@@ -207,7 +271,22 @@ export class _GLTFAnimation {
|
|
|
207
271
|
samplers: [],
|
|
208
272
|
channels: [],
|
|
209
273
|
};
|
|
210
|
-
_GLTFAnimation._AddAnimation(
|
|
274
|
+
_GLTFAnimation._AddAnimation(
|
|
275
|
+
animation.name,
|
|
276
|
+
animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,
|
|
277
|
+
babylonNode,
|
|
278
|
+
combinedAnimation,
|
|
279
|
+
animationInfo.dataAccessorType,
|
|
280
|
+
animationInfo.animationChannelTargetPath,
|
|
281
|
+
nodeMap,
|
|
282
|
+
bufferManager,
|
|
283
|
+
bufferViews,
|
|
284
|
+
accessors,
|
|
285
|
+
animationInfo.useQuaternion,
|
|
286
|
+
animationSampleRate,
|
|
287
|
+
useRightHanded,
|
|
288
|
+
morphTargetManager.numTargets
|
|
289
|
+
);
|
|
211
290
|
if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {
|
|
212
291
|
idleGLTFAnimations.push(glTFAnimation);
|
|
213
292
|
}
|
|
@@ -229,7 +308,17 @@ export class _GLTFAnimation {
|
|
|
229
308
|
* @param accessors
|
|
230
309
|
* @param animationSampleRate
|
|
231
310
|
*/
|
|
232
|
-
static _CreateNodeAndMorphAnimationFromAnimationGroups(
|
|
311
|
+
static _CreateNodeAndMorphAnimationFromAnimationGroups(
|
|
312
|
+
babylonScene,
|
|
313
|
+
glTFAnimations,
|
|
314
|
+
nodeMap,
|
|
315
|
+
bufferManager,
|
|
316
|
+
bufferViews,
|
|
317
|
+
accessors,
|
|
318
|
+
animationSampleRate,
|
|
319
|
+
leftHandedNodes,
|
|
320
|
+
shouldExportAnimation
|
|
321
|
+
) {
|
|
233
322
|
let glTFAnimation;
|
|
234
323
|
if (babylonScene.animationGroups) {
|
|
235
324
|
const animationGroups = babylonScene.animationGroups;
|
|
@@ -242,6 +331,7 @@ export class _GLTFAnimation {
|
|
|
242
331
|
name: animationGroup.name,
|
|
243
332
|
channels: [],
|
|
244
333
|
samplers: [],
|
|
334
|
+
extras: animationGroup.metadata,
|
|
245
335
|
};
|
|
246
336
|
for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {
|
|
247
337
|
const targetAnimation = animationGroup.targetedAnimations[i];
|
|
@@ -256,11 +346,24 @@ export class _GLTFAnimation {
|
|
|
256
346
|
if (animationInfo) {
|
|
257
347
|
const babylonTransformNode = this._IsTransformable(target) ? target : this._IsTransformable(target[0]) ? target[0] : null;
|
|
258
348
|
if (babylonTransformNode) {
|
|
259
|
-
_GLTFAnimation._AddAnimation(
|
|
349
|
+
_GLTFAnimation._AddAnimation(
|
|
350
|
+
`${animation.name}`,
|
|
351
|
+
glTFAnimation,
|
|
352
|
+
babylonTransformNode,
|
|
353
|
+
animation,
|
|
354
|
+
animationInfo.dataAccessorType,
|
|
355
|
+
animationInfo.animationChannelTargetPath,
|
|
356
|
+
nodeMap,
|
|
357
|
+
bufferManager,
|
|
358
|
+
bufferViews,
|
|
359
|
+
accessors,
|
|
360
|
+
animationInfo.useQuaternion,
|
|
361
|
+
animationSampleRate,
|
|
362
|
+
convertToRightHanded
|
|
363
|
+
);
|
|
260
364
|
}
|
|
261
365
|
}
|
|
262
|
-
}
|
|
263
|
-
else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {
|
|
366
|
+
} else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {
|
|
264
367
|
const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);
|
|
265
368
|
if (animationInfo) {
|
|
266
369
|
const babylonMorphTarget = target instanceof MorphTarget ? target : target[0];
|
|
@@ -288,8 +391,7 @@ export class _GLTFAnimation {
|
|
|
288
391
|
}
|
|
289
392
|
}
|
|
290
393
|
}
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
394
|
+
} else {
|
|
293
395
|
// this is the place for the KHR_animation_pointer.
|
|
294
396
|
}
|
|
295
397
|
}
|
|
@@ -317,11 +419,17 @@ export class _GLTFAnimation {
|
|
|
317
419
|
const morphTargetAnimation = animationsByMorphTarget.get(morphTarget);
|
|
318
420
|
if (morphTargetAnimation) {
|
|
319
421
|
if (!combinedAnimationGroup) {
|
|
320
|
-
combinedAnimationGroup = new Animation(
|
|
422
|
+
combinedAnimationGroup = new Animation(
|
|
423
|
+
`${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,
|
|
424
|
+
"influence",
|
|
425
|
+
morphTargetAnimation.framePerSecond,
|
|
426
|
+
Animation.ANIMATIONTYPE_FLOAT,
|
|
427
|
+
morphTargetAnimation.loopMode,
|
|
428
|
+
morphTargetAnimation.enableBlending
|
|
429
|
+
);
|
|
321
430
|
}
|
|
322
431
|
animationKeys.push(morphTargetAnimation.getKeys()[i]);
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
432
|
+
} else {
|
|
325
433
|
animationKeys.push({
|
|
326
434
|
frame: animationGroup.from + (animationGroupFrameDiff / numAnimationKeys) * i,
|
|
327
435
|
value: morphTarget.influence,
|
|
@@ -335,7 +443,22 @@ export class _GLTFAnimation {
|
|
|
335
443
|
combinedAnimationGroup.setKeys(animationKeys);
|
|
336
444
|
const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimationGroup);
|
|
337
445
|
if (animationInfo) {
|
|
338
|
-
_GLTFAnimation._AddAnimation(
|
|
446
|
+
_GLTFAnimation._AddAnimation(
|
|
447
|
+
`${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,
|
|
448
|
+
glTFAnimation,
|
|
449
|
+
mesh,
|
|
450
|
+
combinedAnimationGroup,
|
|
451
|
+
animationInfo.dataAccessorType,
|
|
452
|
+
animationInfo.animationChannelTargetPath,
|
|
453
|
+
nodeMap,
|
|
454
|
+
bufferManager,
|
|
455
|
+
bufferViews,
|
|
456
|
+
accessors,
|
|
457
|
+
animationInfo.useQuaternion,
|
|
458
|
+
animationSampleRate,
|
|
459
|
+
false,
|
|
460
|
+
morphTargetManager?.numTargets
|
|
461
|
+
);
|
|
339
462
|
}
|
|
340
463
|
});
|
|
341
464
|
if (glTFAnimation.channels.length && glTFAnimation.samplers.length) {
|
|
@@ -344,7 +467,22 @@ export class _GLTFAnimation {
|
|
|
344
467
|
}
|
|
345
468
|
}
|
|
346
469
|
}
|
|
347
|
-
static _AddAnimation(
|
|
470
|
+
static _AddAnimation(
|
|
471
|
+
name,
|
|
472
|
+
glTFAnimation,
|
|
473
|
+
babylonTransformNode,
|
|
474
|
+
animation,
|
|
475
|
+
dataAccessorType,
|
|
476
|
+
animationChannelTargetPath,
|
|
477
|
+
nodeMap,
|
|
478
|
+
bufferManager,
|
|
479
|
+
bufferViews,
|
|
480
|
+
accessors,
|
|
481
|
+
useQuaternion,
|
|
482
|
+
animationSampleRate,
|
|
483
|
+
convertToRightHanded,
|
|
484
|
+
morphAnimationChannels
|
|
485
|
+
) {
|
|
348
486
|
const animationData = _GLTFAnimation._CreateNodeAnimation(babylonTransformNode, animation, animationChannelTargetPath, useQuaternion, animationSampleRate);
|
|
349
487
|
let bufferView;
|
|
350
488
|
let accessor;
|
|
@@ -375,10 +513,17 @@ export class _GLTFAnimation {
|
|
|
375
513
|
// Create buffer view and accessor for key frames.
|
|
376
514
|
const inputData = new Float32Array(animationData.inputs);
|
|
377
515
|
bufferView = bufferManager.createBufferView(inputData);
|
|
378
|
-
accessor = bufferManager.createAccessor(
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
516
|
+
accessor = bufferManager.createAccessor(
|
|
517
|
+
bufferView,
|
|
518
|
+
"SCALAR" /* AccessorType.SCALAR */,
|
|
519
|
+
5126 /* AccessorComponentType.FLOAT */,
|
|
520
|
+
animationData.inputs.length,
|
|
521
|
+
undefined,
|
|
522
|
+
{
|
|
523
|
+
min: [animationData.inputsMin],
|
|
524
|
+
max: [animationData.inputsMax],
|
|
525
|
+
}
|
|
526
|
+
);
|
|
382
527
|
accessors.push(accessor);
|
|
383
528
|
keyframeAccessorIndex = accessors.length - 1;
|
|
384
529
|
// Perform conversions on keyed values while also building their buffer.
|
|
@@ -401,8 +546,7 @@ export class _GLTFAnimation {
|
|
|
401
546
|
case "rotation" /* AnimationChannelTargetPath.ROTATION */:
|
|
402
547
|
if (output.length === 4) {
|
|
403
548
|
Quaternion.FromArrayToRef(output, 0, rotationQuaternion);
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
549
|
+
} else {
|
|
406
550
|
outputToWrite = new Array(4); // Will need 4, not 3, for a quaternion
|
|
407
551
|
Vector3.FromArrayToRef(output, 0, eulerVec3);
|
|
408
552
|
Quaternion.FromEulerVectorToRef(eulerVec3, rotationQuaternion);
|
|
@@ -478,22 +622,18 @@ export class _GLTFAnimation {
|
|
|
478
622
|
if (i === 0) {
|
|
479
623
|
// set the first frame to itself
|
|
480
624
|
endFrame = currKeyFrame.frame;
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
625
|
+
} else {
|
|
483
626
|
continue;
|
|
484
627
|
}
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
628
|
+
} else {
|
|
487
629
|
endFrame = nextKeyFrame.frame;
|
|
488
630
|
}
|
|
489
|
-
}
|
|
490
|
-
else {
|
|
631
|
+
} else {
|
|
491
632
|
// at the last key frame
|
|
492
633
|
prevKeyFrame = keyFrames[i - 1];
|
|
493
634
|
if ((currKeyFrame.value.equals && currKeyFrame.value.equals(prevKeyFrame.value)) || currKeyFrame.value === prevKeyFrame.value) {
|
|
494
635
|
continue;
|
|
495
|
-
}
|
|
496
|
-
else {
|
|
636
|
+
} else {
|
|
497
637
|
endFrame = maxFrame;
|
|
498
638
|
}
|
|
499
639
|
}
|
|
@@ -555,14 +695,12 @@ export class _GLTFAnimation {
|
|
|
555
695
|
if (animationChannelTargetPath === "rotation" /* AnimationChannelTargetPath.ROTATION */) {
|
|
556
696
|
if (useQuaternion) {
|
|
557
697
|
quaternionCache = value;
|
|
558
|
-
}
|
|
559
|
-
else {
|
|
698
|
+
} else {
|
|
560
699
|
cacheValue = value;
|
|
561
700
|
Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);
|
|
562
701
|
}
|
|
563
702
|
outputs.push(quaternionCache.asArray());
|
|
564
|
-
}
|
|
565
|
-
else {
|
|
703
|
+
} else {
|
|
566
704
|
// scaling and position animation
|
|
567
705
|
cacheValue = value;
|
|
568
706
|
outputs.push(cacheValue.asArray());
|
|
@@ -595,9 +733,23 @@ export class _GLTFAnimation {
|
|
|
595
733
|
static _CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion) {
|
|
596
734
|
animation.getKeys().forEach(function (keyFrame) {
|
|
597
735
|
inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.
|
|
598
|
-
_GLTFAnimation._AddSplineTangent(
|
|
736
|
+
_GLTFAnimation._AddSplineTangent(
|
|
737
|
+
_TangentType.INTANGENT,
|
|
738
|
+
outputs,
|
|
739
|
+
animationChannelTargetPath,
|
|
740
|
+
"CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */,
|
|
741
|
+
keyFrame,
|
|
742
|
+
useQuaternion
|
|
743
|
+
);
|
|
599
744
|
_GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);
|
|
600
|
-
_GLTFAnimation._AddSplineTangent(
|
|
745
|
+
_GLTFAnimation._AddSplineTangent(
|
|
746
|
+
_TangentType.OUTTANGENT,
|
|
747
|
+
outputs,
|
|
748
|
+
animationChannelTargetPath,
|
|
749
|
+
"CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */,
|
|
750
|
+
keyFrame,
|
|
751
|
+
useQuaternion
|
|
752
|
+
);
|
|
601
753
|
});
|
|
602
754
|
}
|
|
603
755
|
static _GetBasePositionRotationOrScale(babylonTransformNode, animationChannelTargetPath, useQuaternion) {
|
|
@@ -606,17 +758,14 @@ export class _GLTFAnimation {
|
|
|
606
758
|
if (useQuaternion) {
|
|
607
759
|
const q = babylonTransformNode.rotationQuaternion;
|
|
608
760
|
basePositionRotationOrScale = (q ?? Quaternion.Identity()).asArray();
|
|
609
|
-
}
|
|
610
|
-
else {
|
|
761
|
+
} else {
|
|
611
762
|
const r = babylonTransformNode.rotation;
|
|
612
763
|
basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();
|
|
613
764
|
}
|
|
614
|
-
}
|
|
615
|
-
else if (animationChannelTargetPath === "translation" /* AnimationChannelTargetPath.TRANSLATION */) {
|
|
765
|
+
} else if (animationChannelTargetPath === "translation" /* AnimationChannelTargetPath.TRANSLATION */) {
|
|
616
766
|
const p = babylonTransformNode.position;
|
|
617
767
|
basePositionRotationOrScale = (p ?? Vector3.Zero()).asArray();
|
|
618
|
-
}
|
|
619
|
-
else {
|
|
768
|
+
} else {
|
|
620
769
|
// scale
|
|
621
770
|
const s = babylonTransformNode.scaling;
|
|
622
771
|
basePositionRotationOrScale = (s ?? Vector3.One()).asArray();
|
|
@@ -643,12 +792,10 @@ export class _GLTFAnimation {
|
|
|
643
792
|
value = rotationQuaternion.asArray();
|
|
644
793
|
}
|
|
645
794
|
outputs.push(value); // scale vector.
|
|
646
|
-
}
|
|
647
|
-
else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {
|
|
795
|
+
} else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {
|
|
648
796
|
if (animationChannelTargetPath === "weights" /* AnimationChannelTargetPath.WEIGHTS */) {
|
|
649
797
|
outputs.push([keyFrame.value]);
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
798
|
+
} else {
|
|
652
799
|
// handles single component x, y, z or w component animation by using a base property and animating over a component.
|
|
653
800
|
newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(keyFrame.value, babylonTransformNode, animation, animationChannelTargetPath, useQuaternion);
|
|
654
801
|
if (newPositionRotationOrScale) {
|
|
@@ -661,11 +808,9 @@ export class _GLTFAnimation {
|
|
|
661
808
|
outputs.push(newPositionRotationOrScale.asArray());
|
|
662
809
|
}
|
|
663
810
|
}
|
|
664
|
-
}
|
|
665
|
-
else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {
|
|
811
|
+
} else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {
|
|
666
812
|
outputs.push(keyFrame.value.normalize().asArray());
|
|
667
|
-
}
|
|
668
|
-
else {
|
|
813
|
+
} else {
|
|
669
814
|
Tools.Error("glTFAnimation: Unsupported key frame values for animation!");
|
|
670
815
|
}
|
|
671
816
|
}
|
|
@@ -692,25 +837,23 @@ export class _GLTFAnimation {
|
|
|
692
837
|
shouldBakeAnimation = true;
|
|
693
838
|
break;
|
|
694
839
|
}
|
|
695
|
-
}
|
|
696
|
-
else {
|
|
840
|
+
} else {
|
|
697
841
|
interpolationType = "CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */;
|
|
698
842
|
}
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
843
|
+
} else {
|
|
701
844
|
if (interpolationType) {
|
|
702
|
-
if (
|
|
703
|
-
|
|
845
|
+
if (
|
|
846
|
+
interpolationType === "CUBICSPLINE" /* AnimationSamplerInterpolation.CUBICSPLINE */ ||
|
|
847
|
+
(key.interpolation && key.interpolation === 1 /* AnimationKeyInterpolation.STEP */ && interpolationType !== "STEP") /* AnimationSamplerInterpolation.STEP */
|
|
848
|
+
) {
|
|
704
849
|
interpolationType = "LINEAR" /* AnimationSamplerInterpolation.LINEAR */;
|
|
705
850
|
shouldBakeAnimation = true;
|
|
706
851
|
break;
|
|
707
852
|
}
|
|
708
|
-
}
|
|
709
|
-
else {
|
|
853
|
+
} else {
|
|
710
854
|
if (key.interpolation && key.interpolation === 1 /* AnimationKeyInterpolation.STEP */) {
|
|
711
855
|
interpolationType = "STEP" /* AnimationSamplerInterpolation.STEP */;
|
|
712
|
-
}
|
|
713
|
-
else {
|
|
856
|
+
} else {
|
|
714
857
|
interpolationType = "LINEAR" /* AnimationSamplerInterpolation.LINEAR */;
|
|
715
858
|
}
|
|
716
859
|
}
|
|
@@ -739,29 +882,23 @@ export class _GLTFAnimation {
|
|
|
739
882
|
if (tangentValue) {
|
|
740
883
|
if (useQuaternion) {
|
|
741
884
|
tangent = tangentValue.asArray();
|
|
742
|
-
}
|
|
743
|
-
else {
|
|
885
|
+
} else {
|
|
744
886
|
const array = tangentValue;
|
|
745
887
|
tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();
|
|
746
888
|
}
|
|
747
|
-
}
|
|
748
|
-
else {
|
|
889
|
+
} else {
|
|
749
890
|
tangent = [0, 0, 0, 0];
|
|
750
891
|
}
|
|
751
|
-
}
|
|
752
|
-
else if (animationChannelTargetPath === "weights" /* AnimationChannelTargetPath.WEIGHTS */) {
|
|
892
|
+
} else if (animationChannelTargetPath === "weights" /* AnimationChannelTargetPath.WEIGHTS */) {
|
|
753
893
|
if (tangentValue) {
|
|
754
894
|
tangent = [tangentValue];
|
|
755
|
-
}
|
|
756
|
-
else {
|
|
895
|
+
} else {
|
|
757
896
|
tangent = [0];
|
|
758
897
|
}
|
|
759
|
-
}
|
|
760
|
-
else {
|
|
898
|
+
} else {
|
|
761
899
|
if (tangentValue) {
|
|
762
900
|
tangent = tangentValue.asArray();
|
|
763
|
-
}
|
|
764
|
-
else {
|
|
901
|
+
} else {
|
|
765
902
|
tangent = [0, 0, 0];
|
|
766
903
|
}
|
|
767
904
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glTFAnimation.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAnimation, INode, IBufferView, IAccessor, IAnimationSampler, IAnimationChannel } from \"babylonjs-gltf2interface\";\r\nimport { AnimationSamplerInterpolation, AnimationChannelTargetPath, AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { Node } from \"core/node\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\n\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { BufferManager } from \"./bufferManager\";\r\nimport { GetAccessorElementCount, ConvertToRightHandedPosition, Rotate180Y, ConvertToRightHandedRotation } from \"./glTFUtilities\";\r\n\r\n/**\r\n * @internal\r\n * Interface to store animation data.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationData {\r\n /**\r\n * Keyframe data.\r\n */\r\n inputs: number[];\r\n /**\r\n * Value data.\r\n */\r\n outputs: number[][];\r\n /**\r\n * Animation interpolation data.\r\n */\r\n samplerInterpolation: AnimationSamplerInterpolation;\r\n /**\r\n * Minimum keyframe value.\r\n */\r\n inputsMin: number;\r\n /**\r\n * Maximum keyframe value.\r\n */\r\n inputsMax: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationInfo {\r\n /**\r\n * The target channel for the animation\r\n */\r\n animationChannelTargetPath: AnimationChannelTargetPath;\r\n /**\r\n * The glTF accessor type for the data.\r\n */\r\n dataAccessorType: AccessorType.VEC3 | AccessorType.VEC4 | AccessorType.SCALAR;\r\n /**\r\n * Specifies if quaternions should be used.\r\n */\r\n useQuaternion: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n * Enum for handling in tangent and out tangent.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nenum _TangentType {\r\n /**\r\n * Specifies that input tangents are used.\r\n */\r\n INTANGENT,\r\n /**\r\n * Specifies that output tangents are used.\r\n */\r\n OUTTANGENT,\r\n}\r\n\r\n/**\r\n * @internal\r\n * Utility class for generating glTF animation data from BabylonJS.\r\n */\r\nexport class _GLTFAnimation {\r\n /**\r\n * Determine if a node is transformable - ie has properties it should be part of animation of transformation.\r\n * @param babylonNode the node to test\r\n * @returns true if can be animated, false otherwise. False if the parameter is null or undefined.\r\n */\r\n private static _IsTransformable(babylonNode: Node): boolean {\r\n return babylonNode && (babylonNode instanceof TransformNode || babylonNode instanceof Camera || babylonNode instanceof Light);\r\n }\r\n\r\n /**\r\n * @ignore\r\n *\r\n * Creates glTF channel animation from BabylonJS animation.\r\n * @param babylonTransformNode - BabylonJS mesh.\r\n * @param animation - animation.\r\n * @param animationChannelTargetPath - The target animation channel.\r\n * @param useQuaternion - Specifies if quaternions are used.\r\n * @returns nullable IAnimationData\r\n */\r\n public static _CreateNodeAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean,\r\n animationSampleRate: number\r\n ): Nullable<_IAnimationData> {\r\n if (this._IsTransformable(babylonTransformNode)) {\r\n const inputs: number[] = [];\r\n const outputs: number[][] = [];\r\n const keyFrames = animation.getKeys();\r\n const minMaxKeyFrames = _GLTFAnimation._CalculateMinMaxKeyFrames(keyFrames);\r\n const interpolationOrBake = _GLTFAnimation._DeduceInterpolation(keyFrames, animationChannelTargetPath, useQuaternion);\r\n\r\n const interpolation = interpolationOrBake.interpolationType;\r\n const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;\r\n\r\n if (shouldBakeAnimation) {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n }\r\n }\r\n\r\n if (inputs.length && outputs.length) {\r\n const result: _IAnimationData = {\r\n inputs: inputs,\r\n outputs: outputs,\r\n samplerInterpolation: interpolation,\r\n inputsMin: shouldBakeAnimation ? minMaxKeyFrames.min : Tools.FloatRound(minMaxKeyFrames.min / animation.framePerSecond),\r\n inputsMax: shouldBakeAnimation ? minMaxKeyFrames.max : Tools.FloatRound(minMaxKeyFrames.max / animation.framePerSecond),\r\n };\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _DeduceAnimationInfo(animation: Animation): Nullable<_IAnimationInfo> {\r\n let animationChannelTargetPath: Nullable<AnimationChannelTargetPath> = null;\r\n let dataAccessorType = AccessorType.VEC3;\r\n let useQuaternion: boolean = false;\r\n const property = animation.targetProperty.split(\".\");\r\n switch (property[0]) {\r\n case \"scaling\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.SCALE;\r\n break;\r\n }\r\n case \"position\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.TRANSLATION;\r\n break;\r\n }\r\n case \"rotation\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"rotationQuaternion\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n useQuaternion = true;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"influence\": {\r\n dataAccessorType = AccessorType.SCALAR;\r\n animationChannelTargetPath = AnimationChannelTargetPath.WEIGHTS;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported animatable property ${property[0]}`);\r\n }\r\n }\r\n if (animationChannelTargetPath) {\r\n return { animationChannelTargetPath: animationChannelTargetPath, dataAccessorType: dataAccessorType, useQuaternion: useQuaternion };\r\n } else {\r\n Tools.Error(\"animation channel target path and data accessor type could be deduced\");\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node animations from the transform node animations\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAnimationFromNodeAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n nodes: INode[],\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n useRightHanded: boolean,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (_GLTFAnimation._IsTransformable(babylonNode)) {\r\n if (babylonNode.animations) {\r\n for (const animation of babylonNode.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(animation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: animation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n useRightHanded\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create individual morph animations from the mesh's morph target animation tracks\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n nodes: INode[],\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n useRightHanded: boolean,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n for (const animation of morphTarget.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const combinedAnimation = new Animation(\r\n `${animation.name}`,\r\n \"influence\",\r\n animation.framePerSecond,\r\n animation.dataType,\r\n animation.loopMode,\r\n animation.enableBlending\r\n );\r\n const combinedAnimationKeys: IAnimationKey[] = [];\r\n const animationKeys = animation.getKeys();\r\n\r\n for (let j = 0; j < animationKeys.length; ++j) {\r\n const animationKey = animationKeys[j];\r\n for (let k = 0; k < morphTargetManager.numTargets; ++k) {\r\n if (k == i) {\r\n combinedAnimationKeys.push(animationKey);\r\n } else {\r\n combinedAnimationKeys.push({ frame: animationKey.frame, value: 0 });\r\n }\r\n }\r\n }\r\n combinedAnimation.setKeys(combinedAnimationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: combinedAnimation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n animation.name,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n combinedAnimation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n useRightHanded,\r\n morphTargetManager.numTargets\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Create node and morph animations from the animation groups\r\n * @param babylonScene\r\n * @param glTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n leftHandedNodes: Set<Node>,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonScene.animationGroups) {\r\n const animationGroups = babylonScene.animationGroups;\r\n for (const animationGroup of animationGroups) {\r\n const morphAnimations: Map<Mesh, Map<MorphTarget, Animation>> = new Map();\r\n const sampleAnimations: Map<Mesh, Animation> = new Map();\r\n const morphAnimationMeshes: Set<Mesh> = new Set();\r\n const animationGroupFrameDiff = animationGroup.to - animationGroup.from;\r\n glTFAnimation = {\r\n name: animationGroup.name,\r\n channels: [],\r\n samplers: [],\r\n };\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const targetAnimation = animationGroup.targetedAnimations[i];\r\n const target = targetAnimation.target;\r\n const animation = targetAnimation.animation;\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n\r\n const convertToRightHanded = leftHandedNodes.has(target);\r\n\r\n if (this._IsTransformable(target) || (target.length === 1 && this._IsTransformable(target[0]))) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonTransformNode = this._IsTransformable(target) ? target : this._IsTransformable(target[0]) ? target[0] : null;\r\n if (babylonTransformNode) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n glTFAnimation,\r\n babylonTransformNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n convertToRightHanded\r\n );\r\n }\r\n }\r\n } else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonMorphTarget = target instanceof MorphTarget ? target : (target[0] as MorphTarget);\r\n if (babylonMorphTarget) {\r\n const babylonMorphTargetManager = babylonScene.morphTargetManagers.find((morphTargetManager) => {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n if (morphTargetManager.getTarget(j) === babylonMorphTarget) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (babylonMorphTargetManager) {\r\n const babylonMesh = babylonScene.meshes.find((mesh) => {\r\n return (mesh as Mesh).morphTargetManager === babylonMorphTargetManager;\r\n }) as Mesh;\r\n if (babylonMesh) {\r\n if (!morphAnimations.has(babylonMesh)) {\r\n morphAnimations.set(babylonMesh, new Map());\r\n }\r\n morphAnimations.get(babylonMesh)?.set(babylonMorphTarget, animation);\r\n morphAnimationMeshes.add(babylonMesh);\r\n sampleAnimations.set(babylonMesh, animation);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // this is the place for the KHR_animation_pointer.\r\n }\r\n }\r\n morphAnimationMeshes.forEach((mesh) => {\r\n const morphTargetManager = mesh.morphTargetManager!;\r\n let combinedAnimationGroup: Nullable<Animation> = null;\r\n const animationKeys: IAnimationKey[] = [];\r\n const sampleAnimation = sampleAnimations.get(mesh)!;\r\n const sampleAnimationKeys = sampleAnimation.getKeys();\r\n const numAnimationKeys = sampleAnimationKeys.length;\r\n /*\r\n Due to how glTF expects morph target animation data to be formatted, we need to rearrange the individual morph target animation tracks,\r\n such that we have a single animation, where a given keyframe input value has successive output values for each morph target belonging to the manager.\r\n See: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\r\n\r\n We do this via constructing a new Animation track, and interleaving the frames of each morph target animation track in the current Animation Group\r\n We reuse the Babylon Animation data structure for ease of handling export of cubic spline animation keys, and to reuse the\r\n existing _GLTFAnimation.AddAnimation codepath with minimal modification, however the constructed Babylon Animation is NOT intended for use in-engine.\r\n */\r\n for (let i = 0; i < numAnimationKeys; ++i) {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n const morphTarget = morphTargetManager.getTarget(j);\r\n const animationsByMorphTarget = morphAnimations.get(mesh);\r\n if (animationsByMorphTarget) {\r\n const morphTargetAnimation = animationsByMorphTarget.get(morphTarget);\r\n if (morphTargetAnimation) {\r\n if (!combinedAnimationGroup) {\r\n combinedAnimationGroup = new Animation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n \"influence\",\r\n morphTargetAnimation.framePerSecond,\r\n Animation.ANIMATIONTYPE_FLOAT,\r\n morphTargetAnimation.loopMode,\r\n morphTargetAnimation.enableBlending\r\n );\r\n }\r\n animationKeys.push(morphTargetAnimation.getKeys()[i]);\r\n } else {\r\n animationKeys.push({\r\n frame: animationGroup.from + (animationGroupFrameDiff / numAnimationKeys) * i,\r\n value: morphTarget.influence,\r\n inTangent: sampleAnimationKeys[0].inTangent ? 0 : undefined,\r\n outTangent: sampleAnimationKeys[0].outTangent ? 0 : undefined,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n combinedAnimationGroup!.setKeys(animationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimationGroup!);\r\n if (animationInfo) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n glTFAnimation,\r\n mesh,\r\n combinedAnimationGroup!,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n false,\r\n morphTargetManager?.numTargets\r\n );\r\n }\r\n });\r\n if (glTFAnimation.channels.length && glTFAnimation.samplers.length) {\r\n glTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _AddAnimation(\r\n name: string,\r\n glTFAnimation: IAnimation,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n dataAccessorType: AccessorType,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n nodeMap: Map<Node, number>,\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n convertToRightHanded: boolean,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(babylonTransformNode, animation, animationChannelTargetPath, useQuaternion, animationSampleRate);\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let animationSampler: IAnimationSampler;\r\n let animationChannel: IAnimationChannel;\r\n\r\n if (animationData) {\r\n /*\r\n * Now that we have the glTF converted morph target animation data,\r\n * we can remove redundant input data so that we have n input frames,\r\n * and morphAnimationChannels * n output frames\r\n */\r\n if (morphAnimationChannels) {\r\n let index = 0;\r\n let currentInput: number = 0;\r\n const newInputs: number[] = [];\r\n while (animationData.inputs.length > 0) {\r\n currentInput = animationData.inputs.shift()!;\r\n if (index % morphAnimationChannels == 0) {\r\n newInputs.push(currentInput);\r\n }\r\n index++;\r\n }\r\n animationData.inputs = newInputs;\r\n }\r\n\r\n const nodeIndex = nodeMap.get(babylonTransformNode);\r\n\r\n // Create buffer view and accessor for key frames.\r\n const inputData = new Float32Array(animationData.inputs);\r\n bufferView = bufferManager.createBufferView(inputData);\r\n accessor = bufferManager.createAccessor(bufferView, AccessorType.SCALAR, AccessorComponentType.FLOAT, animationData.inputs.length, undefined, {\r\n min: [animationData.inputsMin],\r\n max: [animationData.inputsMax],\r\n });\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // Perform conversions on keyed values while also building their buffer.\r\n const rotationQuaternion = new Quaternion();\r\n const eulerVec3 = new Vector3();\r\n const position = new Vector3();\r\n const isCamera = babylonTransformNode instanceof Camera;\r\n\r\n const elementCount = GetAccessorElementCount(dataAccessorType);\r\n const outputData = new Float32Array(animationData.outputs.length * elementCount);\r\n animationData.outputs.forEach(function (output: number[], index: number) {\r\n let outputToWrite: number[] = output;\r\n switch (animationChannelTargetPath) {\r\n case AnimationChannelTargetPath.TRANSLATION:\r\n if (convertToRightHanded) {\r\n Vector3.FromArrayToRef(output, 0, position);\r\n ConvertToRightHandedPosition(position);\r\n position.toArray(outputToWrite);\r\n }\r\n break;\r\n case AnimationChannelTargetPath.ROTATION:\r\n if (output.length === 4) {\r\n Quaternion.FromArrayToRef(output, 0, rotationQuaternion);\r\n } else {\r\n outputToWrite = new Array(4); // Will need 4, not 3, for a quaternion\r\n Vector3.FromArrayToRef(output, 0, eulerVec3);\r\n Quaternion.FromEulerVectorToRef(eulerVec3, rotationQuaternion);\r\n }\r\n\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedRotation(rotationQuaternion);\r\n if (isCamera) {\r\n Rotate180Y(rotationQuaternion);\r\n }\r\n }\r\n\r\n rotationQuaternion.toArray(outputToWrite);\r\n break;\r\n }\r\n outputData.set(outputToWrite, index * elementCount);\r\n });\r\n\r\n // Create buffer view and accessor for keyed values.\r\n bufferView = bufferManager.createBufferView(outputData);\r\n accessor = bufferManager.createAccessor(bufferView, dataAccessorType, AccessorComponentType.FLOAT, animationData.outputs.length);\r\n accessors.push(accessor);\r\n dataAccessorIndex = accessors.length - 1;\r\n\r\n // create sampler\r\n animationSampler = {\r\n interpolation: animationData.samplerInterpolation,\r\n input: keyframeAccessorIndex,\r\n output: dataAccessorIndex,\r\n };\r\n glTFAnimation.samplers.push(animationSampler);\r\n\r\n // create channel\r\n animationChannel = {\r\n sampler: glTFAnimation.samplers.length - 1,\r\n target: {\r\n node: nodeIndex,\r\n path: animationChannelTargetPath,\r\n },\r\n };\r\n glTFAnimation.channels.push(animationChannel);\r\n }\r\n }\r\n\r\n /**\r\n * Create a baked animation\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation corresponding to the BabylonJS mesh\r\n * @param animationChannelTargetPath animation target channel\r\n * @param minFrame minimum animation frame\r\n * @param maxFrame maximum animation frame\r\n * @param fps frames per second of the animation\r\n * @param sampleRate\r\n * @param inputs input key frames of the animation\r\n * @param outputs output key frame data of the animation\r\n * @param minMaxFrames\r\n * @param minMaxFrames.min\r\n * @param minMaxFrames.max\r\n * @param useQuaternion specifies if quaternions should be used\r\n */\r\n private static _CreateBakedAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n minFrame: number,\r\n maxFrame: number,\r\n fps: number,\r\n sampleRate: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n minMaxFrames: { min: number; max: number },\r\n useQuaternion: boolean\r\n ) {\r\n let value: number | Vector3 | Quaternion;\r\n const quaternionCache: Quaternion = Quaternion.Identity();\r\n let previousTime: Nullable<number> = null;\r\n let time: number;\r\n let maxUsedFrame: Nullable<number> = null;\r\n let currKeyFrame: Nullable<IAnimationKey> = null;\r\n let nextKeyFrame: Nullable<IAnimationKey> = null;\r\n let prevKeyFrame: Nullable<IAnimationKey> = null;\r\n let endFrame: Nullable<number> = null;\r\n minMaxFrames.min = Tools.FloatRound(minFrame / fps);\r\n\r\n const keyFrames = animation.getKeys();\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n endFrame = null;\r\n currKeyFrame = keyFrames[i];\r\n\r\n if (i + 1 < length) {\r\n nextKeyFrame = keyFrames[i + 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(nextKeyFrame.value)) || currKeyFrame.value === nextKeyFrame.value) {\r\n if (i === 0) {\r\n // set the first frame to itself\r\n endFrame = currKeyFrame.frame;\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n endFrame = nextKeyFrame.frame;\r\n }\r\n } else {\r\n // at the last key frame\r\n prevKeyFrame = keyFrames[i - 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(prevKeyFrame.value)) || currKeyFrame.value === prevKeyFrame.value) {\r\n continue;\r\n } else {\r\n endFrame = maxFrame;\r\n }\r\n }\r\n if (endFrame) {\r\n for (let f = currKeyFrame.frame; f <= endFrame; f += sampleRate) {\r\n time = Tools.FloatRound(f / fps);\r\n if (time === previousTime) {\r\n continue;\r\n }\r\n previousTime = time;\r\n maxUsedFrame = time;\r\n const state = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: animation.loopMode,\r\n };\r\n value = animation._interpolate(f, state);\r\n\r\n _GLTFAnimation._SetInterpolatedValue(babylonTransformNode, value, time, animation, animationChannelTargetPath, quaternionCache, inputs, outputs, useQuaternion);\r\n }\r\n }\r\n }\r\n if (maxUsedFrame) {\r\n minMaxFrames.max = maxUsedFrame;\r\n }\r\n }\r\n\r\n private static _ConvertFactorToVector3OrQuaternion(\r\n factor: number,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(babylonTransformNode, animationChannelTargetPath, useQuaternion);\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n const property = animation.targetProperty.split(\".\");\r\n const componentName = property ? property[1] : \"\"; // x, y, z, or w component\r\n const value = useQuaternion ? Quaternion.FromArray(basePositionRotationOrScale).normalize() : Vector3.FromArray(basePositionRotationOrScale);\r\n\r\n switch (componentName) {\r\n case \"x\":\r\n case \"y\":\r\n case \"z\": {\r\n value[componentName] = factor;\r\n break;\r\n }\r\n case \"w\": {\r\n (value as Quaternion).w = factor;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`glTFAnimation: Unsupported component name \"${componentName}\"!`);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private static _SetInterpolatedValue(\r\n babylonTransformNode: Node,\r\n value: number | Vector3 | Quaternion,\r\n time: number,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n quaternionCache: Quaternion,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n let cacheValue: Vector3 | Quaternion | number;\r\n inputs.push(time);\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([value as number]);\r\n return;\r\n }\r\n\r\n if (animation.dataType === Animation.ANIMATIONTYPE_FLOAT) {\r\n value = this._ConvertFactorToVector3OrQuaternion(value as number, babylonTransformNode, animation, animationChannelTargetPath, useQuaternion);\r\n }\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n quaternionCache = value as Quaternion;\r\n } else {\r\n cacheValue = value as Vector3;\r\n Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);\r\n }\r\n outputs.push(quaternionCache.asArray());\r\n } else {\r\n // scaling and position animation\r\n cacheValue = value as Vector3;\r\n outputs.push(cacheValue.asArray());\r\n }\r\n }\r\n\r\n /**\r\n * Creates linear animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateLinearOrStepAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n for (const keyFrame of animation.getKeys()) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Creates cubic spline animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateCubicSplineAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n animation.getKeys().forEach(function (keyFrame) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddSplineTangent(_TangentType.INTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(_TangentType.OUTTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(babylonTransformNode: Node, animationChannelTargetPath: AnimationChannelTargetPath, useQuaternion: boolean) {\r\n let basePositionRotationOrScale: number[];\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n const q = (babylonTransformNode as TransformNode).rotationQuaternion;\r\n basePositionRotationOrScale = (q ?? Quaternion.Identity()).asArray();\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n const p: Vector3 = (babylonTransformNode as TransformNode).position;\r\n basePositionRotationOrScale = (p ?? Vector3.Zero()).asArray();\r\n } else {\r\n // scale\r\n const s: Vector3 = (babylonTransformNode as TransformNode).scaling;\r\n basePositionRotationOrScale = (s ?? Vector3.One()).asArray();\r\n }\r\n return basePositionRotationOrScale;\r\n }\r\n\r\n /**\r\n * Adds a key frame value\r\n * @param keyFrame\r\n * @param animation\r\n * @param outputs\r\n * @param animationChannelTargetPath\r\n * @param babylonTransformNode\r\n * @param useQuaternion\r\n */\r\n private static _AddKeyframeValue(\r\n keyFrame: IAnimationKey,\r\n animation: Animation,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n babylonTransformNode: Node,\r\n useQuaternion: boolean\r\n ) {\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n let value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n const rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n value = rotationQuaternion.asArray();\r\n }\r\n outputs.push(value); // scale vector.\r\n } else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([keyFrame.value]);\r\n } else {\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(\r\n keyFrame.value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n outputs.push(posRotScale.asArray());\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n outputs.push((keyFrame.value as Quaternion).normalize().asArray());\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Determine the interpolation based on the key frames\r\n * @param keyFrames\r\n * @param animationChannelTargetPath\r\n * @param useQuaternion\r\n */\r\n private static _DeduceInterpolation(\r\n keyFrames: IAnimationKey[],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): { interpolationType: AnimationSamplerInterpolation; shouldBakeAnimation: boolean } {\r\n let interpolationType: AnimationSamplerInterpolation | undefined;\r\n let shouldBakeAnimation = false;\r\n let key: IAnimationKey;\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {\r\n return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };\r\n }\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n key = keyFrames[i];\r\n if (key.inTangent || key.outTangent) {\r\n if (interpolationType) {\r\n if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;\r\n }\r\n } else {\r\n if (interpolationType) {\r\n if (\r\n interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||\r\n (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP && interpolationType !== AnimationSamplerInterpolation.STEP)\r\n ) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n if (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP) {\r\n interpolationType = AnimationSamplerInterpolation.STEP;\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n }\r\n }\r\n }\r\n if (!interpolationType) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n\r\n return { interpolationType: interpolationType, shouldBakeAnimation: shouldBakeAnimation };\r\n }\r\n\r\n /**\r\n * Adds an input tangent or output tangent to the output data\r\n * If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion\r\n * @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)\r\n * @param outputs The animation data by keyframe\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param interpolation The interpolation type\r\n * @param keyFrame The key frame with the animation data\r\n * @param useQuaternion Specifies if quaternions are used\r\n */\r\n private static _AddSplineTangent(\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n useQuaternion: boolean\r\n ) {\r\n let tangent: number[];\r\n const tangentValue: Vector3 | Quaternion | number = tangentType === _TangentType.INTANGENT ? keyFrame.inTangent : keyFrame.outTangent;\r\n if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (tangentValue) {\r\n if (useQuaternion) {\r\n tangent = (tangentValue as Quaternion).asArray();\r\n } else {\r\n const array = tangentValue as Vector3;\r\n tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();\r\n }\r\n } else {\r\n tangent = [0, 0, 0, 0];\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n if (tangentValue) {\r\n tangent = [tangentValue as number];\r\n } else {\r\n tangent = [0];\r\n }\r\n } else {\r\n if (tangentValue) {\r\n tangent = (tangentValue as Vector3).asArray();\r\n } else {\r\n tangent = [0, 0, 0];\r\n }\r\n }\r\n\r\n outputs.push(tangent);\r\n }\r\n }\r\n\r\n /**\r\n * Get the minimum and maximum key frames' frame values\r\n * @param keyFrames animation key frames\r\n * @returns the minimum and maximum key frame value\r\n */\r\n private static _CalculateMinMaxKeyFrames(keyFrames: IAnimationKey[]): { min: number; max: number } {\r\n let min: number = Infinity;\r\n let max: number = -Infinity;\r\n keyFrames.forEach(function (keyFrame) {\r\n min = Math.min(min, keyFrame.frame);\r\n max = Math.max(max, keyFrame.frame);\r\n });\r\n\r\n return { min: min, max: max };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"glTFAnimation.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAnimation, INode, IBufferView, IAccessor, IAnimationSampler, IAnimationChannel } from \"babylonjs-gltf2interface\";\r\nimport { AnimationSamplerInterpolation, AnimationChannelTargetPath, AccessorType, AccessorComponentType } from \"babylonjs-gltf2interface\";\r\nimport type { Node } from \"core/node\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport type { IAnimationKey } from \"core/Animations/animationKey\";\r\nimport { AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\n\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { BufferManager } from \"./bufferManager\";\r\nimport { GetAccessorElementCount, ConvertToRightHandedPosition, Rotate180Y, ConvertToRightHandedRotation } from \"./glTFUtilities\";\r\n\r\n/**\r\n * @internal\r\n * Interface to store animation data.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationData {\r\n /**\r\n * Keyframe data.\r\n */\r\n inputs: number[];\r\n /**\r\n * Value data.\r\n */\r\n outputs: number[][];\r\n /**\r\n * Animation interpolation data.\r\n */\r\n samplerInterpolation: AnimationSamplerInterpolation;\r\n /**\r\n * Minimum keyframe value.\r\n */\r\n inputsMin: number;\r\n /**\r\n * Maximum keyframe value.\r\n */\r\n inputsMax: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface _IAnimationInfo {\r\n /**\r\n * The target channel for the animation\r\n */\r\n animationChannelTargetPath: AnimationChannelTargetPath;\r\n /**\r\n * The glTF accessor type for the data.\r\n */\r\n dataAccessorType: AccessorType.VEC3 | AccessorType.VEC4 | AccessorType.SCALAR;\r\n /**\r\n * Specifies if quaternions should be used.\r\n */\r\n useQuaternion: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n * Enum for handling in tangent and out tangent.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nenum _TangentType {\r\n /**\r\n * Specifies that input tangents are used.\r\n */\r\n INTANGENT,\r\n /**\r\n * Specifies that output tangents are used.\r\n */\r\n OUTTANGENT,\r\n}\r\n\r\n/**\r\n * @internal\r\n * Utility class for generating glTF animation data from BabylonJS.\r\n */\r\nexport class _GLTFAnimation {\r\n /**\r\n * Determine if a node is transformable - ie has properties it should be part of animation of transformation.\r\n * @param babylonNode the node to test\r\n * @returns true if can be animated, false otherwise. False if the parameter is null or undefined.\r\n */\r\n private static _IsTransformable(babylonNode: Node): boolean {\r\n return babylonNode && (babylonNode instanceof TransformNode || babylonNode instanceof Camera || babylonNode instanceof Light);\r\n }\r\n\r\n /**\r\n * @ignore\r\n *\r\n * Creates glTF channel animation from BabylonJS animation.\r\n * @param babylonTransformNode - BabylonJS mesh.\r\n * @param animation - animation.\r\n * @param animationChannelTargetPath - The target animation channel.\r\n * @param useQuaternion - Specifies if quaternions are used.\r\n * @returns nullable IAnimationData\r\n */\r\n public static _CreateNodeAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean,\r\n animationSampleRate: number\r\n ): Nullable<_IAnimationData> {\r\n if (this._IsTransformable(babylonTransformNode)) {\r\n const inputs: number[] = [];\r\n const outputs: number[][] = [];\r\n const keyFrames = animation.getKeys();\r\n const minMaxKeyFrames = _GLTFAnimation._CalculateMinMaxKeyFrames(keyFrames);\r\n const interpolationOrBake = _GLTFAnimation._DeduceInterpolation(keyFrames, animationChannelTargetPath, useQuaternion);\r\n\r\n const interpolation = interpolationOrBake.interpolationType;\r\n const shouldBakeAnimation = interpolationOrBake.shouldBakeAnimation;\r\n\r\n if (shouldBakeAnimation) {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(babylonTransformNode, animation, animationChannelTargetPath, inputs, outputs, useQuaternion);\r\n } else {\r\n _GLTFAnimation._CreateBakedAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n minMaxKeyFrames.min,\r\n minMaxKeyFrames.max,\r\n animation.framePerSecond,\r\n animationSampleRate,\r\n inputs,\r\n outputs,\r\n minMaxKeyFrames,\r\n useQuaternion\r\n );\r\n }\r\n }\r\n\r\n if (inputs.length && outputs.length) {\r\n const result: _IAnimationData = {\r\n inputs: inputs,\r\n outputs: outputs,\r\n samplerInterpolation: interpolation,\r\n inputsMin: shouldBakeAnimation ? minMaxKeyFrames.min : Tools.FloatRound(minMaxKeyFrames.min / animation.framePerSecond),\r\n inputsMax: shouldBakeAnimation ? minMaxKeyFrames.max : Tools.FloatRound(minMaxKeyFrames.max / animation.framePerSecond),\r\n };\r\n\r\n return result;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private static _DeduceAnimationInfo(animation: Animation): Nullable<_IAnimationInfo> {\r\n let animationChannelTargetPath: Nullable<AnimationChannelTargetPath> = null;\r\n let dataAccessorType = AccessorType.VEC3;\r\n let useQuaternion: boolean = false;\r\n const property = animation.targetProperty.split(\".\");\r\n switch (property[0]) {\r\n case \"scaling\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.SCALE;\r\n break;\r\n }\r\n case \"position\": {\r\n animationChannelTargetPath = AnimationChannelTargetPath.TRANSLATION;\r\n break;\r\n }\r\n case \"rotation\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"rotationQuaternion\": {\r\n dataAccessorType = AccessorType.VEC4;\r\n useQuaternion = true;\r\n animationChannelTargetPath = AnimationChannelTargetPath.ROTATION;\r\n break;\r\n }\r\n case \"influence\": {\r\n dataAccessorType = AccessorType.SCALAR;\r\n animationChannelTargetPath = AnimationChannelTargetPath.WEIGHTS;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported animatable property ${property[0]}`);\r\n }\r\n }\r\n if (animationChannelTargetPath) {\r\n return { animationChannelTargetPath: animationChannelTargetPath, dataAccessorType: dataAccessorType, useQuaternion: useQuaternion };\r\n } else {\r\n Tools.Error(\"animation channel target path and data accessor type could be deduced\");\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create node animations from the transform node animations\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAnimationFromNodeAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n nodes: INode[],\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n useRightHanded: boolean,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (_GLTFAnimation._IsTransformable(babylonNode)) {\r\n if (babylonNode.animations) {\r\n for (const animation of babylonNode.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(animation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: animation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n useRightHanded\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @ignore\r\n * Create individual morph animations from the mesh's morph target animation tracks\r\n * @param babylonNode\r\n * @param runtimeGLTFAnimation\r\n * @param idleGLTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateMorphTargetAnimationFromMorphTargetAnimations(\r\n babylonNode: Node,\r\n runtimeGLTFAnimation: IAnimation,\r\n idleGLTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n nodes: INode[],\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n useRightHanded: boolean,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonNode instanceof Mesh) {\r\n const morphTargetManager = babylonNode.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let i = 0; i < morphTargetManager.numTargets; ++i) {\r\n const morphTarget = morphTargetManager.getTarget(i);\r\n for (const animation of morphTarget.animations) {\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n const combinedAnimation = new Animation(\r\n `${animation.name}`,\r\n \"influence\",\r\n animation.framePerSecond,\r\n animation.dataType,\r\n animation.loopMode,\r\n animation.enableBlending\r\n );\r\n const combinedAnimationKeys: IAnimationKey[] = [];\r\n const animationKeys = animation.getKeys();\r\n\r\n for (let j = 0; j < animationKeys.length; ++j) {\r\n const animationKey = animationKeys[j];\r\n for (let k = 0; k < morphTargetManager.numTargets; ++k) {\r\n if (k == i) {\r\n combinedAnimationKeys.push(animationKey);\r\n } else {\r\n combinedAnimationKeys.push({ frame: animationKey.frame, value: 0 });\r\n }\r\n }\r\n }\r\n combinedAnimation.setKeys(combinedAnimationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimation);\r\n if (animationInfo) {\r\n glTFAnimation = {\r\n name: combinedAnimation.name,\r\n samplers: [],\r\n channels: [],\r\n };\r\n _GLTFAnimation._AddAnimation(\r\n animation.name,\r\n animation.hasRunningRuntimeAnimations ? runtimeGLTFAnimation : glTFAnimation,\r\n babylonNode,\r\n combinedAnimation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n useRightHanded,\r\n morphTargetManager.numTargets\r\n );\r\n if (glTFAnimation.samplers.length && glTFAnimation.channels.length) {\r\n idleGLTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Create node and morph animations from the animation groups\r\n * @param babylonScene\r\n * @param glTFAnimations\r\n * @param nodeMap\r\n * @param nodes\r\n * @param bufferManager\r\n * @param bufferViews\r\n * @param accessors\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: Map<Node, number>,\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n animationSampleRate: number,\r\n leftHandedNodes: Set<Node>,\r\n shouldExportAnimation?: (animation: Animation) => boolean\r\n ) {\r\n let glTFAnimation: IAnimation;\r\n if (babylonScene.animationGroups) {\r\n const animationGroups = babylonScene.animationGroups;\r\n for (const animationGroup of animationGroups) {\r\n const morphAnimations: Map<Mesh, Map<MorphTarget, Animation>> = new Map();\r\n const sampleAnimations: Map<Mesh, Animation> = new Map();\r\n const morphAnimationMeshes: Set<Mesh> = new Set();\r\n const animationGroupFrameDiff = animationGroup.to - animationGroup.from;\r\n glTFAnimation = {\r\n name: animationGroup.name,\r\n channels: [],\r\n samplers: [],\r\n metadata: animationGroup.metadata,\r\n };\r\n for (let i = 0; i < animationGroup.targetedAnimations.length; ++i) {\r\n const targetAnimation = animationGroup.targetedAnimations[i];\r\n const target = targetAnimation.target;\r\n const animation = targetAnimation.animation;\r\n if (shouldExportAnimation && !shouldExportAnimation(animation)) {\r\n continue;\r\n }\r\n\r\n const convertToRightHanded = leftHandedNodes.has(target);\r\n\r\n if (this._IsTransformable(target) || (target.length === 1 && this._IsTransformable(target[0]))) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonTransformNode = this._IsTransformable(target) ? target : this._IsTransformable(target[0]) ? target[0] : null;\r\n if (babylonTransformNode) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animation.name}`,\r\n glTFAnimation,\r\n babylonTransformNode,\r\n animation,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n convertToRightHanded\r\n );\r\n }\r\n }\r\n } else if (target instanceof MorphTarget || (target.length === 1 && target[0] instanceof MorphTarget)) {\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);\r\n if (animationInfo) {\r\n const babylonMorphTarget = target instanceof MorphTarget ? target : (target[0] as MorphTarget);\r\n if (babylonMorphTarget) {\r\n const babylonMorphTargetManager = babylonScene.morphTargetManagers.find((morphTargetManager) => {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n if (morphTargetManager.getTarget(j) === babylonMorphTarget) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n if (babylonMorphTargetManager) {\r\n const babylonMesh = babylonScene.meshes.find((mesh) => {\r\n return (mesh as Mesh).morphTargetManager === babylonMorphTargetManager;\r\n }) as Mesh;\r\n if (babylonMesh) {\r\n if (!morphAnimations.has(babylonMesh)) {\r\n morphAnimations.set(babylonMesh, new Map());\r\n }\r\n morphAnimations.get(babylonMesh)?.set(babylonMorphTarget, animation);\r\n morphAnimationMeshes.add(babylonMesh);\r\n sampleAnimations.set(babylonMesh, animation);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // this is the place for the KHR_animation_pointer.\r\n }\r\n }\r\n morphAnimationMeshes.forEach((mesh) => {\r\n const morphTargetManager = mesh.morphTargetManager!;\r\n let combinedAnimationGroup: Nullable<Animation> = null;\r\n const animationKeys: IAnimationKey[] = [];\r\n const sampleAnimation = sampleAnimations.get(mesh)!;\r\n const sampleAnimationKeys = sampleAnimation.getKeys();\r\n const numAnimationKeys = sampleAnimationKeys.length;\r\n /*\r\n Due to how glTF expects morph target animation data to be formatted, we need to rearrange the individual morph target animation tracks,\r\n such that we have a single animation, where a given keyframe input value has successive output values for each morph target belonging to the manager.\r\n See: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\r\n\r\n We do this via constructing a new Animation track, and interleaving the frames of each morph target animation track in the current Animation Group\r\n We reuse the Babylon Animation data structure for ease of handling export of cubic spline animation keys, and to reuse the\r\n existing _GLTFAnimation.AddAnimation codepath with minimal modification, however the constructed Babylon Animation is NOT intended for use in-engine.\r\n */\r\n for (let i = 0; i < numAnimationKeys; ++i) {\r\n for (let j = 0; j < morphTargetManager.numTargets; ++j) {\r\n const morphTarget = morphTargetManager.getTarget(j);\r\n const animationsByMorphTarget = morphAnimations.get(mesh);\r\n if (animationsByMorphTarget) {\r\n const morphTargetAnimation = animationsByMorphTarget.get(morphTarget);\r\n if (morphTargetAnimation) {\r\n if (!combinedAnimationGroup) {\r\n combinedAnimationGroup = new Animation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n \"influence\",\r\n morphTargetAnimation.framePerSecond,\r\n Animation.ANIMATIONTYPE_FLOAT,\r\n morphTargetAnimation.loopMode,\r\n morphTargetAnimation.enableBlending\r\n );\r\n }\r\n animationKeys.push(morphTargetAnimation.getKeys()[i]);\r\n } else {\r\n animationKeys.push({\r\n frame: animationGroup.from + (animationGroupFrameDiff / numAnimationKeys) * i,\r\n value: morphTarget.influence,\r\n inTangent: sampleAnimationKeys[0].inTangent ? 0 : undefined,\r\n outTangent: sampleAnimationKeys[0].outTangent ? 0 : undefined,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n combinedAnimationGroup!.setKeys(animationKeys);\r\n const animationInfo = _GLTFAnimation._DeduceAnimationInfo(combinedAnimationGroup!);\r\n if (animationInfo) {\r\n _GLTFAnimation._AddAnimation(\r\n `${animationGroup.name}_${mesh.name}_MorphWeightAnimation`,\r\n glTFAnimation,\r\n mesh,\r\n combinedAnimationGroup!,\r\n animationInfo.dataAccessorType,\r\n animationInfo.animationChannelTargetPath,\r\n nodeMap,\r\n bufferManager,\r\n bufferViews,\r\n accessors,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\r\n false,\r\n morphTargetManager?.numTargets\r\n );\r\n }\r\n });\r\n if (glTFAnimation.channels.length && glTFAnimation.samplers.length) {\r\n glTFAnimations.push(glTFAnimation);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _AddAnimation(\r\n name: string,\r\n glTFAnimation: IAnimation,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n dataAccessorType: AccessorType,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n nodeMap: Map<Node, number>,\r\n bufferManager: BufferManager,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n convertToRightHanded: boolean,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(babylonTransformNode, animation, animationChannelTargetPath, useQuaternion, animationSampleRate);\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let animationSampler: IAnimationSampler;\r\n let animationChannel: IAnimationChannel;\r\n\r\n if (animationData) {\r\n /*\r\n * Now that we have the glTF converted morph target animation data,\r\n * we can remove redundant input data so that we have n input frames,\r\n * and morphAnimationChannels * n output frames\r\n */\r\n if (morphAnimationChannels) {\r\n let index = 0;\r\n let currentInput: number = 0;\r\n const newInputs: number[] = [];\r\n while (animationData.inputs.length > 0) {\r\n currentInput = animationData.inputs.shift()!;\r\n if (index % morphAnimationChannels == 0) {\r\n newInputs.push(currentInput);\r\n }\r\n index++;\r\n }\r\n animationData.inputs = newInputs;\r\n }\r\n\r\n const nodeIndex = nodeMap.get(babylonTransformNode);\r\n\r\n // Create buffer view and accessor for key frames.\r\n const inputData = new Float32Array(animationData.inputs);\r\n bufferView = bufferManager.createBufferView(inputData);\r\n accessor = bufferManager.createAccessor(bufferView, AccessorType.SCALAR, AccessorComponentType.FLOAT, animationData.inputs.length, undefined, {\r\n min: [animationData.inputsMin],\r\n max: [animationData.inputsMax],\r\n });\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // Perform conversions on keyed values while also building their buffer.\r\n const rotationQuaternion = new Quaternion();\r\n const eulerVec3 = new Vector3();\r\n const position = new Vector3();\r\n const isCamera = babylonTransformNode instanceof Camera;\r\n\r\n const elementCount = GetAccessorElementCount(dataAccessorType);\r\n const outputData = new Float32Array(animationData.outputs.length * elementCount);\r\n animationData.outputs.forEach(function (output: number[], index: number) {\r\n let outputToWrite: number[] = output;\r\n switch (animationChannelTargetPath) {\r\n case AnimationChannelTargetPath.TRANSLATION:\r\n if (convertToRightHanded) {\r\n Vector3.FromArrayToRef(output, 0, position);\r\n ConvertToRightHandedPosition(position);\r\n position.toArray(outputToWrite);\r\n }\r\n break;\r\n case AnimationChannelTargetPath.ROTATION:\r\n if (output.length === 4) {\r\n Quaternion.FromArrayToRef(output, 0, rotationQuaternion);\r\n } else {\r\n outputToWrite = new Array(4); // Will need 4, not 3, for a quaternion\r\n Vector3.FromArrayToRef(output, 0, eulerVec3);\r\n Quaternion.FromEulerVectorToRef(eulerVec3, rotationQuaternion);\r\n }\r\n\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedRotation(rotationQuaternion);\r\n if (isCamera) {\r\n Rotate180Y(rotationQuaternion);\r\n }\r\n }\r\n\r\n rotationQuaternion.toArray(outputToWrite);\r\n break;\r\n }\r\n outputData.set(outputToWrite, index * elementCount);\r\n });\r\n\r\n // Create buffer view and accessor for keyed values.\r\n bufferView = bufferManager.createBufferView(outputData);\r\n accessor = bufferManager.createAccessor(bufferView, dataAccessorType, AccessorComponentType.FLOAT, animationData.outputs.length);\r\n accessors.push(accessor);\r\n dataAccessorIndex = accessors.length - 1;\r\n\r\n // create sampler\r\n animationSampler = {\r\n interpolation: animationData.samplerInterpolation,\r\n input: keyframeAccessorIndex,\r\n output: dataAccessorIndex,\r\n };\r\n glTFAnimation.samplers.push(animationSampler);\r\n\r\n // create channel\r\n animationChannel = {\r\n sampler: glTFAnimation.samplers.length - 1,\r\n target: {\r\n node: nodeIndex,\r\n path: animationChannelTargetPath,\r\n },\r\n };\r\n glTFAnimation.channels.push(animationChannel);\r\n }\r\n }\r\n\r\n /**\r\n * Create a baked animation\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation corresponding to the BabylonJS mesh\r\n * @param animationChannelTargetPath animation target channel\r\n * @param minFrame minimum animation frame\r\n * @param maxFrame maximum animation frame\r\n * @param fps frames per second of the animation\r\n * @param sampleRate\r\n * @param inputs input key frames of the animation\r\n * @param outputs output key frame data of the animation\r\n * @param minMaxFrames\r\n * @param minMaxFrames.min\r\n * @param minMaxFrames.max\r\n * @param useQuaternion specifies if quaternions should be used\r\n */\r\n private static _CreateBakedAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n minFrame: number,\r\n maxFrame: number,\r\n fps: number,\r\n sampleRate: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n minMaxFrames: { min: number; max: number },\r\n useQuaternion: boolean\r\n ) {\r\n let value: number | Vector3 | Quaternion;\r\n const quaternionCache: Quaternion = Quaternion.Identity();\r\n let previousTime: Nullable<number> = null;\r\n let time: number;\r\n let maxUsedFrame: Nullable<number> = null;\r\n let currKeyFrame: Nullable<IAnimationKey> = null;\r\n let nextKeyFrame: Nullable<IAnimationKey> = null;\r\n let prevKeyFrame: Nullable<IAnimationKey> = null;\r\n let endFrame: Nullable<number> = null;\r\n minMaxFrames.min = Tools.FloatRound(minFrame / fps);\r\n\r\n const keyFrames = animation.getKeys();\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n endFrame = null;\r\n currKeyFrame = keyFrames[i];\r\n\r\n if (i + 1 < length) {\r\n nextKeyFrame = keyFrames[i + 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(nextKeyFrame.value)) || currKeyFrame.value === nextKeyFrame.value) {\r\n if (i === 0) {\r\n // set the first frame to itself\r\n endFrame = currKeyFrame.frame;\r\n } else {\r\n continue;\r\n }\r\n } else {\r\n endFrame = nextKeyFrame.frame;\r\n }\r\n } else {\r\n // at the last key frame\r\n prevKeyFrame = keyFrames[i - 1];\r\n if ((currKeyFrame.value.equals && currKeyFrame.value.equals(prevKeyFrame.value)) || currKeyFrame.value === prevKeyFrame.value) {\r\n continue;\r\n } else {\r\n endFrame = maxFrame;\r\n }\r\n }\r\n if (endFrame) {\r\n for (let f = currKeyFrame.frame; f <= endFrame; f += sampleRate) {\r\n time = Tools.FloatRound(f / fps);\r\n if (time === previousTime) {\r\n continue;\r\n }\r\n previousTime = time;\r\n maxUsedFrame = time;\r\n const state = {\r\n key: 0,\r\n repeatCount: 0,\r\n loopMode: animation.loopMode,\r\n };\r\n value = animation._interpolate(f, state);\r\n\r\n _GLTFAnimation._SetInterpolatedValue(babylonTransformNode, value, time, animation, animationChannelTargetPath, quaternionCache, inputs, outputs, useQuaternion);\r\n }\r\n }\r\n }\r\n if (maxUsedFrame) {\r\n minMaxFrames.max = maxUsedFrame;\r\n }\r\n }\r\n\r\n private static _ConvertFactorToVector3OrQuaternion(\r\n factor: number,\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(babylonTransformNode, animationChannelTargetPath, useQuaternion);\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n const property = animation.targetProperty.split(\".\");\r\n const componentName = property ? property[1] : \"\"; // x, y, z, or w component\r\n const value = useQuaternion ? Quaternion.FromArray(basePositionRotationOrScale).normalize() : Vector3.FromArray(basePositionRotationOrScale);\r\n\r\n switch (componentName) {\r\n case \"x\":\r\n case \"y\":\r\n case \"z\": {\r\n value[componentName] = factor;\r\n break;\r\n }\r\n case \"w\": {\r\n (value as Quaternion).w = factor;\r\n break;\r\n }\r\n default: {\r\n Tools.Error(`glTFAnimation: Unsupported component name \"${componentName}\"!`);\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private static _SetInterpolatedValue(\r\n babylonTransformNode: Node,\r\n value: number | Vector3 | Quaternion,\r\n time: number,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n quaternionCache: Quaternion,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n let cacheValue: Vector3 | Quaternion | number;\r\n inputs.push(time);\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([value as number]);\r\n return;\r\n }\r\n\r\n if (animation.dataType === Animation.ANIMATIONTYPE_FLOAT) {\r\n value = this._ConvertFactorToVector3OrQuaternion(value as number, babylonTransformNode, animation, animationChannelTargetPath, useQuaternion);\r\n }\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n quaternionCache = value as Quaternion;\r\n } else {\r\n cacheValue = value as Vector3;\r\n Quaternion.RotationYawPitchRollToRef(cacheValue.y, cacheValue.x, cacheValue.z, quaternionCache);\r\n }\r\n outputs.push(quaternionCache.asArray());\r\n } else {\r\n // scaling and position animation\r\n cacheValue = value as Vector3;\r\n outputs.push(cacheValue.asArray());\r\n }\r\n }\r\n\r\n /**\r\n * Creates linear animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateLinearOrStepAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n for (const keyFrame of animation.getKeys()) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n }\r\n }\r\n\r\n /**\r\n * Creates cubic spline animation from the animation key frames\r\n * @param babylonTransformNode BabylonJS mesh\r\n * @param animation BabylonJS animation\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param inputs Array to store the key frame times\r\n * @param outputs Array to store the key frame data\r\n * @param useQuaternion Specifies if quaternions are used in the animation\r\n */\r\n private static _CreateCubicSplineAnimation(\r\n babylonTransformNode: Node,\r\n animation: Animation,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n inputs: number[],\r\n outputs: number[][],\r\n useQuaternion: boolean\r\n ) {\r\n animation.getKeys().forEach(function (keyFrame) {\r\n inputs.push(keyFrame.frame / animation.framePerSecond); // keyframes in seconds.\r\n _GLTFAnimation._AddSplineTangent(_TangentType.INTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(_TangentType.OUTTANGENT, outputs, animationChannelTargetPath, AnimationSamplerInterpolation.CUBICSPLINE, keyFrame, useQuaternion);\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(babylonTransformNode: Node, animationChannelTargetPath: AnimationChannelTargetPath, useQuaternion: boolean) {\r\n let basePositionRotationOrScale: number[];\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (useQuaternion) {\r\n const q = (babylonTransformNode as TransformNode).rotationQuaternion;\r\n basePositionRotationOrScale = (q ?? Quaternion.Identity()).asArray();\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n const p: Vector3 = (babylonTransformNode as TransformNode).position;\r\n basePositionRotationOrScale = (p ?? Vector3.Zero()).asArray();\r\n } else {\r\n // scale\r\n const s: Vector3 = (babylonTransformNode as TransformNode).scaling;\r\n basePositionRotationOrScale = (s ?? Vector3.One()).asArray();\r\n }\r\n return basePositionRotationOrScale;\r\n }\r\n\r\n /**\r\n * Adds a key frame value\r\n * @param keyFrame\r\n * @param animation\r\n * @param outputs\r\n * @param animationChannelTargetPath\r\n * @param babylonTransformNode\r\n * @param useQuaternion\r\n */\r\n private static _AddKeyframeValue(\r\n keyFrame: IAnimationKey,\r\n animation: Animation,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n babylonTransformNode: Node,\r\n useQuaternion: boolean\r\n ) {\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n let value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n const rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n value = rotationQuaternion.asArray();\r\n }\r\n outputs.push(value); // scale vector.\r\n } else if (animationType === Animation.ANIMATIONTYPE_FLOAT) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n outputs.push([keyFrame.value]);\r\n } else {\r\n // handles single component x, y, z or w component animation by using a base property and animating over a component.\r\n newPositionRotationOrScale = this._ConvertFactorToVector3OrQuaternion(\r\n keyFrame.value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n outputs.push(posRotScale.asArray());\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n outputs.push((keyFrame.value as Quaternion).normalize().asArray());\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Determine the interpolation based on the key frames\r\n * @param keyFrames\r\n * @param animationChannelTargetPath\r\n * @param useQuaternion\r\n */\r\n private static _DeduceInterpolation(\r\n keyFrames: IAnimationKey[],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n useQuaternion: boolean\r\n ): { interpolationType: AnimationSamplerInterpolation; shouldBakeAnimation: boolean } {\r\n let interpolationType: AnimationSamplerInterpolation | undefined;\r\n let shouldBakeAnimation = false;\r\n let key: IAnimationKey;\r\n\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION && !useQuaternion) {\r\n return { interpolationType: AnimationSamplerInterpolation.LINEAR, shouldBakeAnimation: true };\r\n }\r\n\r\n for (let i = 0, length = keyFrames.length; i < length; ++i) {\r\n key = keyFrames[i];\r\n if (key.inTangent || key.outTangent) {\r\n if (interpolationType) {\r\n if (interpolationType !== AnimationSamplerInterpolation.CUBICSPLINE) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.CUBICSPLINE;\r\n }\r\n } else {\r\n if (interpolationType) {\r\n if (\r\n interpolationType === AnimationSamplerInterpolation.CUBICSPLINE ||\r\n (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP && interpolationType !== AnimationSamplerInterpolation.STEP)\r\n ) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n shouldBakeAnimation = true;\r\n break;\r\n }\r\n } else {\r\n if (key.interpolation && key.interpolation === AnimationKeyInterpolation.STEP) {\r\n interpolationType = AnimationSamplerInterpolation.STEP;\r\n } else {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n }\r\n }\r\n }\r\n if (!interpolationType) {\r\n interpolationType = AnimationSamplerInterpolation.LINEAR;\r\n }\r\n\r\n return { interpolationType: interpolationType, shouldBakeAnimation: shouldBakeAnimation };\r\n }\r\n\r\n /**\r\n * Adds an input tangent or output tangent to the output data\r\n * If an input tangent or output tangent is missing, it uses the zero vector or zero quaternion\r\n * @param tangentType Specifies which type of tangent to handle (inTangent or outTangent)\r\n * @param outputs The animation data by keyframe\r\n * @param animationChannelTargetPath The target animation channel\r\n * @param interpolation The interpolation type\r\n * @param keyFrame The key frame with the animation data\r\n * @param useQuaternion Specifies if quaternions are used\r\n */\r\n private static _AddSplineTangent(\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n useQuaternion: boolean\r\n ) {\r\n let tangent: number[];\r\n const tangentValue: Vector3 | Quaternion | number = tangentType === _TangentType.INTANGENT ? keyFrame.inTangent : keyFrame.outTangent;\r\n if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n if (tangentValue) {\r\n if (useQuaternion) {\r\n tangent = (tangentValue as Quaternion).asArray();\r\n } else {\r\n const array = tangentValue as Vector3;\r\n tangent = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z).asArray();\r\n }\r\n } else {\r\n tangent = [0, 0, 0, 0];\r\n }\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.WEIGHTS) {\r\n if (tangentValue) {\r\n tangent = [tangentValue as number];\r\n } else {\r\n tangent = [0];\r\n }\r\n } else {\r\n if (tangentValue) {\r\n tangent = (tangentValue as Vector3).asArray();\r\n } else {\r\n tangent = [0, 0, 0];\r\n }\r\n }\r\n\r\n outputs.push(tangent);\r\n }\r\n }\r\n\r\n /**\r\n * Get the minimum and maximum key frames' frame values\r\n * @param keyFrames animation key frames\r\n * @returns the minimum and maximum key frame value\r\n */\r\n private static _CalculateMinMaxKeyFrames(keyFrames: IAnimationKey[]): { min: number; max: number } {\r\n let min: number = Infinity;\r\n let max: number = -Infinity;\r\n keyFrames.forEach(function (keyFrame) {\r\n min = Math.min(min, keyFrame.frame);\r\n max = Math.max(max, keyFrame.frame);\r\n });\r\n\r\n return { min: min, max: max };\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onerjs/serializers",
|
|
3
|
-
"version": "8.23.
|
|
3
|
+
"version": "8.23.7",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"module": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"postcompile": "build-tools -c add-js-to-es6"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@onerjs/core": "^8.23.
|
|
21
|
+
"@onerjs/core": "^8.23.7",
|
|
22
22
|
"@dev/build-tools": "^1.0.0",
|
|
23
23
|
"@lts/serializers": "^1.0.0",
|
|
24
24
|
"babylonjs-gltf2interface": "^8.23.1"
|