@babylonjs/serializers 5.51.0 → 5.53.0

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.
@@ -88,7 +88,7 @@ export declare class _GLTFAnimation {
88
88
  */
89
89
  static _CreateNodeAnimationFromNodeAnimations(babylonNode: Node, runtimeGLTFAnimation: IAnimation, idleGLTFAnimations: IAnimation[], nodeMap: {
90
90
  [key: number]: number;
91
- }, nodes: INode[], binaryWriter: _BinaryWriter, bufferViews: IBufferView[], accessors: IAccessor[], convertToRightHandedSystem: boolean, animationSampleRate: number): void;
91
+ }, nodes: INode[], binaryWriter: _BinaryWriter, bufferViews: IBufferView[], accessors: IAccessor[], convertToRightHandedSystem: boolean, animationSampleRate: number, shouldExportAnimation?: (animation: Animation) => boolean): void;
92
92
  /**
93
93
  * @ignore
94
94
  * Create individual morph animations from the mesh's morph target animation tracks
@@ -105,7 +105,7 @@ export declare class _GLTFAnimation {
105
105
  */
106
106
  static _CreateMorphTargetAnimationFromMorphTargetAnimations(babylonNode: Node, runtimeGLTFAnimation: IAnimation, idleGLTFAnimations: IAnimation[], nodeMap: {
107
107
  [key: number]: number;
108
- }, nodes: INode[], binaryWriter: _BinaryWriter, bufferViews: IBufferView[], accessors: IAccessor[], convertToRightHandedSystem: boolean, animationSampleRate: number): void;
108
+ }, nodes: INode[], binaryWriter: _BinaryWriter, bufferViews: IBufferView[], accessors: IAccessor[], convertToRightHandedSystem: boolean, animationSampleRate: number, shouldExportAnimation?: (animation: Animation) => boolean): void;
109
109
  /**
110
110
  * @ignore
111
111
  * Create node and morph animations from the animation groups
@@ -123,7 +123,7 @@ export declare class _GLTFAnimation {
123
123
  [key: number]: number;
124
124
  }, nodes: INode[], binaryWriter: _BinaryWriter, bufferViews: IBufferView[], accessors: IAccessor[], convertToRightHandedSystemMap: {
125
125
  [nodeId: number]: boolean;
126
- }, animationSampleRate: number): void;
126
+ }, animationSampleRate: number, shouldExportAnimation?: (animation: Animation) => boolean): void;
127
127
  private static _AddAnimation;
128
128
  /**
129
129
  * Create a baked animation
@@ -141,11 +141,14 @@ export class _GLTFAnimation {
141
141
  * @param convertToRightHandedSystem
142
142
  * @param animationSampleRate
143
143
  */
144
- static _CreateNodeAnimationFromNodeAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystem, animationSampleRate) {
144
+ static _CreateNodeAnimationFromNodeAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystem, animationSampleRate, shouldExportAnimation) {
145
145
  let glTFAnimation;
146
146
  if (_GLTFAnimation._IsTransformable(babylonNode)) {
147
147
  if (babylonNode.animations) {
148
148
  for (const animation of babylonNode.animations) {
149
+ if (shouldExportAnimation && !shouldExportAnimation(animation)) {
150
+ continue;
151
+ }
149
152
  const animationInfo = _GLTFAnimation._DeduceAnimationInfo(animation);
150
153
  if (animationInfo) {
151
154
  glTFAnimation = {
@@ -176,7 +179,7 @@ export class _GLTFAnimation {
176
179
  * @param convertToRightHandedSystem
177
180
  * @param animationSampleRate
178
181
  */
179
- static _CreateMorphTargetAnimationFromMorphTargetAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystem, animationSampleRate) {
182
+ static _CreateMorphTargetAnimationFromMorphTargetAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystem, animationSampleRate, shouldExportAnimation) {
180
183
  let glTFAnimation;
181
184
  if (babylonNode instanceof Mesh) {
182
185
  const morphTargetManager = babylonNode.morphTargetManager;
@@ -184,6 +187,9 @@ export class _GLTFAnimation {
184
187
  for (let i = 0; i < morphTargetManager.numTargets; ++i) {
185
188
  const morphTarget = morphTargetManager.getTarget(i);
186
189
  for (const animation of morphTarget.animations) {
190
+ if (shouldExportAnimation && !shouldExportAnimation(animation)) {
191
+ continue;
192
+ }
187
193
  const combinedAnimation = new Animation(`${animation.name}`, "influence", animation.framePerSecond, animation.dataType, animation.loopMode, animation.enableBlending);
188
194
  const combinedAnimationKeys = [];
189
195
  const animationKeys = animation.getKeys();
@@ -229,7 +235,7 @@ export class _GLTFAnimation {
229
235
  * @param convertToRightHandedSystemMap
230
236
  * @param animationSampleRate
231
237
  */
232
- static _CreateNodeAndMorphAnimationFromAnimationGroups(babylonScene, glTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystemMap, animationSampleRate) {
238
+ static _CreateNodeAndMorphAnimationFromAnimationGroups(babylonScene, glTFAnimations, nodeMap, nodes, binaryWriter, bufferViews, accessors, convertToRightHandedSystemMap, animationSampleRate, shouldExportAnimation) {
233
239
  var _a;
234
240
  let glTFAnimation;
235
241
  if (babylonScene.animationGroups) {
@@ -248,6 +254,9 @@ export class _GLTFAnimation {
248
254
  const targetAnimation = animationGroup.targetedAnimations[i];
249
255
  const target = targetAnimation.target;
250
256
  const animation = targetAnimation.animation;
257
+ if (shouldExportAnimation && !shouldExportAnimation(animation)) {
258
+ continue;
259
+ }
251
260
  if (this._IsTransformable(target) || (target.length === 1 && this._IsTransformable(target[0]))) {
252
261
  const animationInfo = _GLTFAnimation._DeduceAnimationInfo(targetAnimation.animation);
253
262
  if (animationInfo) {
@@ -1 +1 @@
1
- {"version":3,"file":"glTFAnimation.js","sourceRoot":"","sources":["../../../../../lts/serializers/generated/glTF/2.0/glTFAnimation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,6CAA+B;AAC7D,OAAO,EAAE,KAAK,EAAE,sCAAwB;AACxC,OAAO,EAAE,SAAS,EAAE,gDAAkC;AACtD,OAAO,EAAE,aAAa,EAAE,gDAAkC;AAE1D,OAAO,EAAE,WAAW,EAAE,6CAA+B;AACrD,OAAO,EAAE,IAAI,EAAE,uCAAyB;AAGxC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAAE,mDAAqC;AAEzE,OAAO,EAAE,MAAM,EAAE,0CAA4B;AAC7C,OAAO,EAAE,KAAK,EAAE,wCAA0B;AAiD1C;;;GAGG;AACH,gEAAgE;AAChE,IAAK,YASJ;AATD,WAAK,YAAY;IACb;;OAEG;IACH,yDAAS,CAAA;IACT;;OAEG;IACH,2DAAU,CAAA;AACd,CAAC,EATI,YAAY,KAAZ,YAAY,QAShB;AAED;;;GAGG;AACH,MAAM,OAAO,cAAc;IACvB;;;;OAIG;IACK,MAAM,CAAC,gBAAgB,CAAC,WAAiB;QAC7C,OAAO,WAAW,IAAI,CAAC,WAAW,YAAY,aAAa,IAAI,WAAW,YAAY,MAAM,IAAI,WAAW,YAAY,KAAK,CAAC,CAAC;IAClI,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,oBAAoB,CAC9B,oBAA0B,EAC1B,SAAoB,EACpB,0BAAsD,EACtD,0BAAmC,EACnC,aAAsB,EACtB,mBAA2B;QAE3B,IAAI,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE;YAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAe,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,eAAe,GAAG,cAAc,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;YAC5E,MAAM,mBAAmB,GAAG,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC;YACtH,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC;YAE7D,MAAM,aAAa,GAAG,mBAAmB,CAAC,iBAAiB,CAAC;YAC5D,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,mBAAmB,CAAC;YAEpE,IAAI,mBAAmB,EAAE;gBACrB,cAAc,CAAC,qBAAqB,CAChC,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,eAAe,CAAC,GAAG,EACnB,eAAe,CAAC,GAAG,EACnB,SAAS,CAAC,cAAc,EACxB,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,eAAe,EACf,0BAA0B,EAC1B,aAAa,CAChB,CAAC;aACL;iBAAM;gBACH,IAAI,aAAa,wDAAyC,IAAI,aAAa,oDAAuC,EAAE;oBAChH,cAAc,CAAC,4BAA4B,CACvC,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,UAAU,EACV,MAAM,EACN,OAAO,EACP,0BAA0B,EAC1B,aAAa,CAChB,CAAC;iBACL;qBAAM,IAAI,aAAa,kEAA8C,EAAE;oBACpE,cAAc,CAAC,2BAA2B,CACtC,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,UAAU,EACV,MAAM,EACN,OAAO,EACP,0BAA0B,EAC1B,aAAa,CAChB,CAAC;iBACL;qBAAM;oBACH,cAAc,CAAC,qBAAqB,CAChC,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,eAAe,CAAC,GAAG,EACnB,eAAe,CAAC,GAAG,EACnB,SAAS,CAAC,cAAc,EACxB,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,eAAe,EACf,0BAA0B,EAC1B,aAAa,CAChB,CAAC;iBACL;aACJ;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;gBACjC,MAAM,MAAM,GAAoB;oBAC5B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,OAAO;oBAChB,oBAAoB,EAAE,aAAa;oBACnC,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC;oBACvH,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC;iBAC1H,CAAC;gBAEF,OAAO,MAAM,CAAC;aACjB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,SAAoB;QACpD,IAAI,0BAA0B,GAAyC,IAAI,CAAC;QAC5E,IAAI,gBAAgB,iCAAoB,CAAC;QACzC,IAAI,aAAa,GAAY,KAAK,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE;YACjB,KAAK,SAAS,CAAC,CAAC;gBACZ,0BAA0B,iDAAmC,CAAC;gBAC9D,MAAM;aACT;YACD,KAAK,UAAU,CAAC,CAAC;gBACb,0BAA0B,6DAAyC,CAAC;gBACpE,MAAM;aACT;YACD,KAAK,UAAU,CAAC,CAAC;gBACb,gBAAgB,iCAAoB,CAAC;gBACrC,0BAA0B,uDAAsC,CAAC;gBACjE,MAAM;aACT;YACD,KAAK,oBAAoB,CAAC,CAAC;gBACvB,gBAAgB,iCAAoB,CAAC;gBACrC,aAAa,GAAG,IAAI,CAAC;gBACrB,0BAA0B,uDAAsC,CAAC;gBACjE,MAAM;aACT;YACD,KAAK,WAAW,CAAC,CAAC;gBACd,gBAAgB,qCAAsB,CAAC;gBACvC,0BAA0B,qDAAqC,CAAC;gBAChE,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,KAAK,CAAC,mCAAmC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACjE;SACJ;QACD,IAAI,0BAA0B,EAAE;YAC5B,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;SACvI;aAAM;YACH,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;SACxF;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,sCAAsC,CAChD,WAAiB,EACjB,oBAAgC,EAChC,kBAAgC,EAChC,OAAkC,EAClC,KAAc,EACd,YAA2B,EAC3B,WAA0B,EAC1B,SAAsB,EACtB,0BAAmC,EACnC,mBAA2B;QAE3B,IAAI,aAAyB,CAAC;QAC9B,IAAI,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE;YAC9C,IAAI,WAAW,CAAC,UAAU,EAAE;gBACxB,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;oBAC5C,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;oBACrE,IAAI,aAAa,EAAE;wBACf,aAAa,GAAG;4BACZ,IAAI,EAAE,SAAS,CAAC,IAAI;4BACpB,QAAQ,EAAE,EAAE;4BACZ,QAAQ,EAAE,EAAE;yBACf,CAAC;wBACF,cAAc,CAAC,aAAa,CACxB,GAAG,SAAS,CAAC,IAAI,EAAE,EACnB,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,aAAa,EAC5E,WAAW,EACX,SAAS,EACT,aAAa,CAAC,gBAAgB,EAC9B,aAAa,CAAC,0BAA0B,EACxC,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,0BAA0B,EAC1B,aAAa,CAAC,aAAa,EAC3B,mBAAmB,CACtB,CAAC;wBACF,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE;4BAChE,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;yBAC1C;qBACJ;iBACJ;aACJ;SACJ;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,oDAAoD,CAC9D,WAAiB,EACjB,oBAAgC,EAChC,kBAAgC,EAChC,OAAkC,EAClC,KAAc,EACd,YAA2B,EAC3B,WAA0B,EAC1B,SAAsB,EACtB,0BAAmC,EACnC,mBAA2B;QAE3B,IAAI,aAAyB,CAAC;QAC9B,IAAI,WAAW,YAAY,IAAI,EAAE;YAC7B,MAAM,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,CAAC;YAC1D,IAAI,kBAAkB,EAAE;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;oBACpD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACpD,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;wBAC5C,MAAM,iBAAiB,GAAG,IAAI,SAAS,CACnC,GAAG,SAAS,CAAC,IAAI,EAAE,EACnB,WAAW,EACX,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,cAAc,CAC3B,CAAC;wBACF,MAAM,qBAAqB,GAAoB,EAAE,CAAC;wBAClD,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;wBAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;4BAC3C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;4BACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;gCACpD,IAAI,CAAC,IAAI,CAAC,EAAE;oCACR,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iCAC5C;qCAAM;oCACH,qBAAqB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;iCACvE;6BACJ;yBACJ;wBACD,iBAAiB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;wBACjD,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;wBAC7E,IAAI,aAAa,EAAE;4BACf,aAAa,GAAG;gCACZ,IAAI,EAAE,iBAAiB,CAAC,IAAI;gCAC5B,QAAQ,EAAE,EAAE;gCACZ,QAAQ,EAAE,EAAE;6BACf,CAAC;4BACF,cAAc,CAAC,aAAa,CACxB,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,aAAa,EAC5E,WAAW,EACX,iBAAiB,EACjB,aAAa,CAAC,gBAAgB,EAC9B,aAAa,CAAC,0BAA0B,EACxC,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,0BAA0B,EAC1B,aAAa,CAAC,aAAa,EAC3B,mBAAmB,EACnB,kBAAkB,CAAC,UAAU,CAChC,CAAC;4BACF,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE;gCAChE,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;6BAC1C;yBACJ;qBACJ;iBACJ;aACJ;SACJ;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,+CAA+C,CACzD,YAAmB,EACnB,cAA4B,EAC5B,OAAkC,EAClC,KAAc,EACd,YAA2B,EAC3B,WAA0B,EAC1B,SAAsB,EACtB,6BAA4D,EAC5D,mBAA2B;;QAE3B,IAAI,aAAyB,CAAC;QAC9B,IAAI,YAAY,CAAC,eAAe,EAAE;YAC9B,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC;YACrD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;gBAC1C,MAAM,eAAe,GAA2C,IAAI,GAAG,EAAE,CAAC;gBAC1E,MAAM,gBAAgB,GAAyB,IAAI,GAAG,EAAE,CAAC;gBACzD,MAAM,oBAAoB,GAAc,IAAI,GAAG,EAAE,CAAC;gBAClD,MAAM,uBAAuB,GAAG,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC;gBACxE,aAAa,GAAG;oBACZ,IAAI,EAAE,cAAc,CAAC,IAAI;oBACzB,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE,EAAE;iBACf,CAAC;gBACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/D,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;oBAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;oBACtC,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;oBAC5C,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC5F,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;wBACrF,IAAI,aAAa,EAAE;4BACf,MAAM,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;4BAC1H,IAAI,oBAAoB,EAAE;gCACtB,MAAM,0BAA0B,GAAG,6BAA6B,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gCAChG,cAAc,CAAC,aAAa,CACxB,GAAG,SAAS,CAAC,IAAI,EAAE,EACnB,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,aAAa,CAAC,gBAAgB,EAC9B,aAAa,CAAC,0BAA0B,EACxC,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,0BAA0B,EAC1B,aAAa,CAAC,aAAa,EAC3B,mBAAmB,CACtB,CAAC;6BACL;yBACJ;qBACJ;yBAAM,IAAI,MAAM,YAAY,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY,WAAW,CAAC,EAAE;wBACnG,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;wBACrF,IAAI,aAAa,EAAE;4BACf,MAAM,kBAAkB,GAAG,MAAM,YAAY,WAAW,CAAC,CAAC,CAAE,MAAsB,CAAC,CAAC,CAAE,MAAM,CAAC,CAAC,CAAiB,CAAC;4BAChH,IAAI,kBAAkB,EAAE;gCACpB,MAAM,yBAAyB,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,EAAE;oCAC3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;wCACpD,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,kBAAkB,EAAE;4CACxD,OAAO,IAAI,CAAC;yCACf;qCACJ;oCACD,OAAO,KAAK,CAAC;gCACjB,CAAC,CAAC,CAAC;gCACH,IAAI,yBAAyB,EAAE;oCAC3B,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wCAClD,OAAQ,IAAa,CAAC,kBAAkB,KAAK,yBAAyB,CAAC;oCAC3E,CAAC,CAAS,CAAC;oCACX,IAAI,WAAW,EAAE;wCACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;4CACnC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;yCAC/C;wCACD,MAAA,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,0CAAE,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;wCACrE,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;wCACtC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;qCAChD;iCACJ;6BACJ;yBACJ;qBACJ;yBAAM;wBACH,mDAAmD;qBACtD;iBACJ;gBACD,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAmB,CAAC;oBACpD,IAAI,sBAAsB,GAAwB,IAAI,CAAC;oBACvD,MAAM,aAAa,GAAoB,EAAE,CAAC;oBAC1C,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;oBACpD,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;oBACtD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC;oBACpD;;;;;;;;sBAQE;oBACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,EAAE,CAAC,EAAE;wBACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;4BACpD,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;4BACpD,MAAM,uBAAuB,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BAC1D,IAAI,uBAAuB,EAAE;gCACzB,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gCACtE,IAAI,oBAAoB,EAAE;oCACtB,IAAI,CAAC,sBAAsB,EAAE;wCACzB,sBAAsB,GAAG,IAAI,SAAS,CAClC,GAAG,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,uBAAuB,EAC1D,WAAW,EACX,oBAAoB,CAAC,cAAc,EACnC,SAAS,CAAC,mBAAmB,EAC7B,oBAAoB,CAAC,QAAQ,EAC7B,oBAAoB,CAAC,cAAc,CACtC,CAAC;qCACL;oCACD,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;iCACzD;qCAAM;oCACH,aAAa,CAAC,IAAI,CAAC;wCACf,KAAK,EAAE,cAAc,CAAC,IAAI,GAAG,CAAC,uBAAuB,GAAG,gBAAgB,CAAC,GAAG,CAAC;wCAC7E,KAAK,EAAE,WAAW,CAAC,SAAS;wCAC5B,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;wCAC3D,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;qCAChE,CAAC,CAAC;iCACN;6BACJ;yBACJ;qBACJ;oBACD,sBAAuB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC/C,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,sBAAuB,CAAC,CAAC;oBACnF,IAAI,aAAa,EAAE;wBACf,cAAc,CAAC,aAAa,CACxB,GAAG,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,uBAAuB,EAC1D,aAAa,EACb,IAAI,EACJ,sBAAuB,EACvB,aAAa,CAAC,gBAAgB,EAC9B,aAAa,CAAC,0BAA0B,EACxC,OAAO,EACP,YAAY,EACZ,WAAW,EACX,SAAS,EACT,KAAK,EACL,aAAa,CAAC,aAAa,EAC3B,mBAAmB,EACnB,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,UAAU,CACjC,CAAC;qBACL;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE;oBAChE,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBACtC;aACJ;SACJ;IACL,CAAC;IAEO,MAAM,CAAC,aAAa,CACxB,IAAY,EACZ,aAAyB,EACzB,oBAA0B,EAC1B,SAAoB,EACpB,gBAA8B,EAC9B,0BAAsD,EACtD,OAAkC,EAClC,YAA2B,EAC3B,WAA0B,EAC1B,SAAsB,EACtB,0BAAmC,EACnC,aAAsB,EACtB,mBAA2B,EAC3B,sBAA+B;QAE/B,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CACrD,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,CACtB,CAAC;QACF,IAAI,UAAuB,CAAC;QAC5B,IAAI,QAAmB,CAAC;QACxB,IAAI,qBAA6B,CAAC;QAClC,IAAI,iBAAyB,CAAC;QAC9B,IAAI,YAAoB,CAAC;QACzB,IAAI,gBAAmC,CAAC;QACxC,IAAI,gBAAmC,CAAC;QAExC,IAAI,aAAa,EAAE;YACf;;;;eAIG;YACH,IAAI,sBAAsB,EAAE;gBACxB,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,IAAI,YAAY,GAAW,CAAC,CAAC;gBAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpC,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC;oBAC7C,IAAI,KAAK,GAAG,sBAAsB,IAAI,CAAC,EAAE;wBACrC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;qBAChC;oBACD,KAAK,EAAE,CAAC;iBACX;gBACD,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC;aACpC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAEzD,mDAAmD;YACnD,IAAI,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACjD,UAAU,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,sBAAsB,CAAC,CAAC;YACrI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK;gBACxC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,QAAQ,GAAG,cAAc,CAAC,eAAe,CACrC,WAAW,CAAC,MAAM,GAAG,CAAC,EACtB,GAAG,IAAI,aAAa,8EAGpB,aAAa,CAAC,MAAM,CAAC,MAAM,EAC3B,IAAI,EACJ,CAAC,aAAa,CAAC,SAAS,CAAC,EACzB,CAAC,aAAa,CAAC,SAAS,CAAC,CAC5B,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,qBAAqB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAE7C,mDAAmD;YACnD,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,UAAU,GAAG,cAAc,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAE9G,gCAAgC;YAChC,UAAU,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC,EAAE,YAAY,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;YAC5H,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE7B,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,MAAM;gBAC1C,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK;oBAC1B,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,gBAAgB,0CAA+B,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClK,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,iBAAiB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAEzC,iBAAiB;YACjB,gBAAgB,GAAG;gBACf,aAAa,EAAE,aAAa,CAAC,oBAAoB;gBACjD,KAAK,EAAE,qBAAqB;gBAC5B,MAAM,EAAE,iBAAiB;aAC5B,CAAC;YACF,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAE9C,iBAAiB;YACjB,gBAAgB,GAAG;gBACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAC1C,MAAM,EAAE;oBACJ,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,0BAA0B;iBACnC;aACJ,CAAC;YACF,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACjD;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,MAAM,CAAC,qBAAqB,CAChC,oBAA0B,EAC1B,SAAoB,EACpB,0BAAsD,EACtD,QAAgB,EAChB,QAAgB,EAChB,GAAW,EACX,UAAkB,EAClB,MAAgB,EAChB,OAAmB,EACnB,YAA0C,EAC1C,0BAAmC,EACnC,aAAsB;QAEtB,IAAI,KAAoC,CAAC;QACzC,MAAM,eAAe,GAAe,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC1D,IAAI,YAAY,GAAqB,IAAI,CAAC;QAC1C,IAAI,IAAY,CAAC;QACjB,IAAI,YAAY,GAAqB,IAAI,CAAC;QAC1C,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,IAAI,QAAQ,GAAqB,IAAI,CAAC;QACtC,YAAY,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE;YACxD,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;gBAChB,YAAY,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,EAAE;oBAC3H,IAAI,CAAC,KAAK,CAAC,EAAE;wBACT,gCAAgC;wBAChC,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;qBACjC;yBAAM;wBACH,SAAS;qBACZ;iBACJ;qBAAM;oBACH,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;iBACjC;aACJ;iBAAM;gBACH,wBAAwB;gBACxB,YAAY,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,EAAE;oBAC3H,SAAS;iBACZ;qBAAM;oBACH,QAAQ,GAAG,QAAQ,CAAC;iBACvB;aACJ;YACD,IAAI,QAAQ,EAAE;gBACV,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,UAAU,EAAE;oBAC7D,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;oBACjC,IAAI,IAAI,KAAK,YAAY,EAAE;wBACvB,SAAS;qBACZ;oBACD,YAAY,GAAG,IAAI,CAAC;oBACpB,YAAY,GAAG,IAAI,CAAC;oBACpB,MAAM,KAAK,GAAG;wBACV,GAAG,EAAE,CAAC;wBACN,WAAW,EAAE,CAAC;wBACd,QAAQ,EAAE,SAAS,CAAC,QAAQ;qBAC/B,CAAC;oBACF,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAEzC,cAAc,CAAC,qBAAqB,CAChC,oBAAoB,EACpB,KAAK,EACL,IAAI,EACJ,SAAS,EACT,0BAA0B,EAC1B,eAAe,EACf,MAAM,EACN,OAAO,EACP,0BAA0B,EAC1B,aAAa,CAChB,CAAC;iBACL;aACJ;SACJ;QACD,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,GAAG,GAAG,YAAY,CAAC;SACnC;IACL,CAAC;IAEO,MAAM,CAAC,mCAAmC,CAC9C,MAAc,EACd,oBAA0B,EAC1B,SAAoB,EACpB,0BAAsD,EACtD,0BAAmC,EACnC,aAAsB;QAEtB,MAAM,2BAA2B,GAAG,cAAc,CAAC,+BAA+B,CAC9E,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,CAChB,CAAC;QACF,qHAAqH;QACrH,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,uBAAuB;QAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAE7I,QAAQ,aAAa,EAAE;YACnB,KAAK,GAAG,CAAC,CAAC;gBACN,KAAK,CAAC,aAAa,CAAC,GAAG,0BAA0B,IAAI,aAAa,IAAI,0BAA0B,mDAAqC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzJ,MAAM;aACT;YACD,KAAK,GAAG,CAAC,CAAC;gBACN,KAAK,CAAC,aAAa,CAAC,GAAG,0BAA0B,IAAI,aAAa,IAAI,0BAA0B,mDAAqC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzJ,MAAM;aACT;YACD,KAAK,GAAG,CAAC,CAAC;gBACN,KAAK,CAAC,aAAa,CAAC,GAAG,0BAA0B,IAAI,CAAC,aAAa,IAAI,0BAA0B,mDAAqC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC1J,MAAM;aACT;YACD,KAAK,GAAG,CAAC,CAAC;gBACL,KAAoB,CAAC,CAAC,GAAG,MAAM,CAAC;gBACjC,MAAM;aACT;YACD,OAAO,CAAC,CAAC;gBACL,KAAK,CAAC,KAAK,CAAC,8CAA8C,aAAa,IAAI,CAAC,CAAC;aAChF;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAChC,oBAA0B,EAC1B,KAAoC,EACpC,IAAY,EACZ,SAAoB,EACpB,0BAAsD,EACtD,eAA2B,EAC3B,MAAgB,EAChB,OAAmB,EACnB,0BAAmC,EACnC,aAAsB;QAEtB,IAAI,UAAyC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElB,IAAI,0BAA0B,uDAAuC,EAAE;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAe,CAAC,CAAC,CAAC;YAChC,OAAO;SACV;QAED,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,mBAAmB,EAAE;YACtD,KAAK,GAAG,IAAI,CAAC,mCAAmC,CAC5C,KAAe,EACf,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,CAChB,CAAC;SACL;QAED,IAAI,0BAA0B,yDAAwC,EAAE;YACpE,IAAI,aAAa,EAAE;gBACf,eAAe,GAAG,KAAmB,CAAC;aACzC;iBAAM;gBACH,UAAU,GAAG,KAAgB,CAAC;gBAC9B,UAAU,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;aACnG;YACD,IAAI,0BAA0B,EAAE;gBAC5B,cAAc,CAAC,gCAAgC,CAAC,eAAe,CAAC,CAAC;gBAEjE,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;oBAC9B,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;iBAClF;aACJ;YACD,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;SAC3C;aAAM;YACH,iCAAiC;YACjC,UAAU,GAAG,KAAgB,CAAC;YAC9B,IAAI,0BAA0B,IAAI,0BAA0B,mDAAqC,EAAE;gBAC/F,cAAc,CAAC,qCAAqC,CAAC,UAAU,CAAC,CAAC;gBACjE,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;oBAC9B,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnB,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;iBACtB;aACJ;YAED,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;SACtC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACK,MAAM,CAAC,4BAA4B,CACvC,oBAA0B,EAC1B,SAAoB,EACpB,0BAAsD,EACtD,UAAkB,EAClB,MAAgB,EAChB,OAAmB,EACnB,0BAAmC,EACnC,aAAsB;QAEtB,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB;YAChF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC;SAC/J;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACK,MAAM,CAAC,2BAA2B,CACtC,oBAA0B,EAC1B,SAAoB,EACpB,0BAAsD,EACtD,UAAkB,EAClB,MAAgB,EAChB,OAAmB,EACnB,0BAAmC,EACnC,aAAsB;QAEtB,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,QAAQ;YAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB;YAChF,cAAc,CAAC,iBAAiB,CAC5B,oBAAoB,EACpB,YAAY,CAAC,SAAS,EACtB,OAAO,EACP,0BAA0B,iEAE1B,QAAQ,EACR,UAAU,EACV,aAAa,EACb,0BAA0B,CAC7B,CAAC;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC;YAE5J,cAAc,CAAC,iBAAiB,CAC5B,oBAAoB,EACpB,YAAY,CAAC,UAAU,EACvB,OAAO,EACP,0BAA0B,iEAE1B,QAAQ,EACR,UAAU,EACV,aAAa,EACb,0BAA0B,CAC7B,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,+BAA+B,CAC1C,oBAA0B,EAC1B,0BAAsD,EACtD,0BAAmC,EACnC,aAAsB;QAEtB,IAAI,2BAAqC,CAAC;QAC1C,IAAI,0BAA0B,yDAAwC,EAAE;YACpE,IAAI,aAAa,EAAE;gBACf,MAAM,CAAC,GAAI,oBAAsC,CAAC,kBAAkB,CAAC;gBACrE,2BAA2B,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBACrE,IAAI,0BAA0B,EAAE;oBAC5B,cAAc,CAAC,qCAAqC,CAAC,2BAA2B,CAAC,CAAC;oBAClF,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;wBAC9B,2BAA2B,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC1I;iBACJ;aACJ;iBAAM;gBACH,MAAM,CAAC,GAAa,oBAAsC,CAAC,QAAQ,CAAC;gBACpE,2BAA2B,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9D,cAAc,CAAC,kCAAkC,CAAC,2BAA2B,CAAC,CAAC;aAClF;SACJ;aAAM,IAAI,0BAA0B,+DAA2C,EAAE;YAC9E,MAAM,CAAC,GAAa,oBAAsC,CAAC,QAAQ,CAAC;YACpE,2BAA2B,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC9D,IAAI,0BAA0B,EAAE;gBAC5B,cAAc,CAAC,oCAAoC,CAAC,2BAA2B,CAAC,CAAC;aACpF;SACJ;aAAM;YACH,QAAQ;YACR,MAAM,CAAC,GAAa,oBAAsC,CAAC,OAAO,CAAC;YACnE,2BAA2B,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAChE;QACD,OAAO,2BAA2B,CAAC;IACvC,CAAC;IAED;;;;;;;;;OASG;IACK,MAAM,CAAC,iBAAiB,CAC5B,QAAuB,EACvB,SAAoB,EACpB,OAAmB,EACnB,0BAAsD,EACtD,oBAA0B,EAC1B,0BAAmC,EACnC,aAAsB;QAEtB,IAAI,KAAe,CAAC;QACpB,IAAI,0BAAmE,CAAC;QACxE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC;QACzC,IAAI,aAAa,KAAK,SAAS,CAAC,qBAAqB,EAAE;YACnD,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,0BAA0B,yDAAwC,EAAE;gBACpE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACvC,IAAI,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpF,IAAI,0BAA0B,EAAE;oBAC5B,cAAc,CAAC,gCAAgC,CAAC,kBAAkB,CAAC,CAAC;oBAEpE,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;wBAC9B,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;qBACxF;iBACJ;gBACD,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC;aACxC;iBAAM,IAAI,0BAA0B,+DAA2C,EAAE;gBAC9E,IAAI,0BAA0B,EAAE;oBAC5B,cAAc,CAAC,kCAAkC,CAAC,KAAK,CAAC,CAAC;oBACzD,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;wBAC9B,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;wBACf,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;qBAClB;iBACJ;aACJ;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;SACzC;aAAM,IAAI,aAAa,KAAK,SAAS,CAAC,mBAAmB,EAAE;YACxD,IAAI,0BAA0B,uDAAuC,EAAE;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;aAClC;iBAAM;gBACH,qHAAqH;gBACrH,0BAA0B,GAAG,IAAI,CAAC,mCAAmC,CACjE,QAAQ,CAAC,KAAe,EACxB,oBAAoB,EACpB,SAAS,EACT,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,CAChB,CAAC;gBACF,IAAI,0BAA0B,EAAE;oBAC5B,IAAI,0BAA0B,yDAAwC,EAAE;wBACpE,IAAI,WAAW,GAAG,aAAa;4BAC3B,CAAC,CAAE,0BAAyC;4BAC5C,CAAC,CAAC,UAAU,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;wBAC5I,IAAI,0BAA0B,EAAE;4BAC5B,cAAc,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;4BAE7D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;gCAC9B,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;6BAC1E;yBACJ;wBACD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;qBACvC;yBAAM,IAAI,0BAA0B,+DAA2C,EAAE;wBAC9E,IAAI,0BAA0B,EAAE;4BAC5B,cAAc,CAAC,mCAAmC,CAAC,0BAAqC,CAAC,CAAC;4BAE1F,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;gCAC9B,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gCACnC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;6BACtC;yBACJ;qBACJ;oBACD,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,CAAC,CAAC;iBACtD;aACJ;SACJ;aAAM,IAAI,aAAa,KAAK,SAAS,CAAC,wBAAwB,EAAE;YAC7D,KAAK,GAAI,QAAQ,CAAC,KAAoB,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;YAE7D,IAAI,0BAA0B,EAAE;gBAC5B,cAAc,CAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC;gBAE5D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;oBAC9B,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC9F;aACJ;YAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvB;aAAM;YACH,KAAK,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;SAC7E;IACL,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,oBAAoB,CAC/B,SAA0B,EAC1B,0BAAsD,EACtD,aAAsB;QAEtB,IAAI,iBAA4D,CAAC;QACjE,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,GAAkB,CAAC;QAEvB,IAAI,0BAA0B,yDAAwC,IAAI,CAAC,aAAa,EAAE;YACtF,OAAO,EAAE,iBAAiB,qDAAsC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;SACjG;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE;YACxD,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE;gBACjC,IAAI,iBAAiB,EAAE;oBACnB,IAAI,iBAAiB,kEAA8C,EAAE;wBACjE,iBAAiB,sDAAuC,CAAC;wBACzD,mBAAmB,GAAG,IAAI,CAAC;wBAC3B,MAAM;qBACT;iBACJ;qBAAM;oBACH,iBAAiB,gEAA4C,CAAC;iBACjE;aACJ;iBAAM;gBACH,IAAI,iBAAiB,EAAE;oBACnB,IACI,iBAAiB,kEAA8C;wBAC/D,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,KAAK,yBAAyB,CAAC,IAAI,IAAI,iBAAiB,oDAAuC,CAAC,EACzI;wBACE,iBAAiB,sDAAuC,CAAC;wBACzD,mBAAmB,GAAG,IAAI,CAAC;wBAC3B,MAAM;qBACT;iBACJ;qBAAM;oBACH,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,KAAK,yBAAyB,CAAC,IAAI,EAAE;wBAC3E,iBAAiB,kDAAqC,CAAC;qBAC1D;yBAAM;wBACH,iBAAiB,sDAAuC,CAAC;qBAC5D;iBACJ;aACJ;SACJ;QACD,IAAI,CAAC,iBAAiB,EAAE;YACpB,iBAAiB,sDAAuC,CAAC;SAC5D;QAED,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;IAC9F,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,MAAM,CAAC,iBAAiB,CAC5B,oBAA0B,EAC1B,WAAyB,EACzB,OAAmB,EACnB,0BAAsD,EACtD,aAA4C,EAC5C,QAAuB,EACvB,UAAkB,EAClB,aAAsB,EACtB,0BAAmC;QAEnC,IAAI,OAAiB,CAAC;QACtB,MAAM,YAAY,GAAkC,WAAW,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtI,IAAI,aAAa,kEAA8C,EAAE;YAC7D,IAAI,0BAA0B,yDAAwC,EAAE;gBACpE,IAAI,YAAY,EAAE;oBACd,IAAI,aAAa,EAAE;wBACf,OAAO,GAAI,YAA2B,CAAC,OAAO,EAAE,CAAC;qBACpD;yBAAM;wBACH,MAAM,KAAK,GAAG,YAAuB,CAAC;wBACtC,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;qBAClF;oBAED,IAAI,0BAA0B,EAAE;wBAC5B,cAAc,CAAC,qCAAqC,CAAC,OAAO,CAAC,CAAC;wBAC9D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;4BAC9B,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;yBAClG;qBACJ;iBACJ;qBAAM;oBACH,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;iBAC1B;aACJ;iBAAM,IAAI,0BAA0B,uDAAuC,EAAE;gBAC1E,IAAI,YAAY,EAAE;oBACd,OAAO,GAAG,CAAC,YAAsB,CAAC,CAAC;iBACtC;qBAAM;oBACH,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;iBACjB;aACJ;iBAAM;gBACH,IAAI,YAAY,EAAE;oBACd,OAAO,GAAI,YAAwB,CAAC,OAAO,EAAE,CAAC;oBAC9C,IAAI,0BAA0B,EAAE;wBAC5B,IAAI,0BAA0B,+DAA2C,EAAE;4BACvE,cAAc,CAAC,oCAAoC,CAAC,OAAO,CAAC,CAAC;4BAC7D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;gCAC9B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;gCACtB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;6BACzB;yBACJ;qBACJ;iBACJ;qBAAM;oBACH,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;iBACvB;aACJ;YAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACzB;IACL,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,yBAAyB,CAAC,SAA0B;QAC/D,IAAI,GAAG,GAAW,QAAQ,CAAC;QAC3B,IAAI,GAAG,GAAW,CAAC,QAAQ,CAAC;QAC5B,SAAS,CAAC,OAAO,CAAC,UAAU,QAAQ;YAChC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;CACJ","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 { _BinaryWriter } from \"./glTFExporter\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\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\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 convertToRightHandedSystem - Specifies if the values should be converted to right-handed.\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 convertToRightHandedSystem: boolean,\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 const frameDelta = minMaxKeyFrames.max - minMaxKeyFrames.min;\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 convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 convertToRightHandedSystem,\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\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: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number\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 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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\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: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number\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 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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\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 * @ignore\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystemMap\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystemMap: { [nodeId: number]: boolean },\r\n animationSampleRate: number\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 (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 const convertToRightHandedSystem = convertToRightHandedSystemMap[babylonTransformNode.uniqueId];\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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\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 as MorphTarget) : (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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n false,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\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: { [key: number]: number },\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion,\r\n animationSampleRate\r\n );\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let outputLength: 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[babylonTransformNode.uniqueId];\r\n\r\n // Creates buffer view and accessor for key frames.\r\n let byteLength = animationData.inputs.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} keyframe data view`);\r\n bufferViews.push(bufferView);\r\n animationData.inputs.forEach(function (input) {\r\n binaryWriter.setFloat32(input);\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViews.length - 1,\r\n `${name} keyframes`,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.FLOAT,\r\n animationData.inputs.length,\r\n null,\r\n [animationData.inputsMin],\r\n [animationData.inputsMax]\r\n );\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // create bufferview and accessor for keyed values.\r\n outputLength = animationData.outputs.length;\r\n byteLength = _GLTFUtilities._GetDataAccessorElementCount(dataAccessorType) * 4 * animationData.outputs.length;\r\n\r\n // check for in and out tangents\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} data view`);\r\n bufferViews.push(bufferView);\r\n\r\n animationData.outputs.forEach(function (output) {\r\n output.forEach(function (entry) {\r\n binaryWriter.setFloat32(entry);\r\n });\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(bufferViews.length - 1, `${name} data`, dataAccessorType, AccessorComponentType.FLOAT, outputLength, null, null, null);\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 convertToRightHandedSystem converts the values to right-handed\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 convertToRightHandedSystem: boolean,\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(\r\n babylonTransformNode,\r\n value,\r\n time,\r\n animation,\r\n animationChannelTargetPath,\r\n quaternionCache,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(\r\n babylonTransformNode,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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, or z 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 value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"y\": {\r\n value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"z\": {\r\n value[componentName] = convertToRightHandedSystem && !useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : 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 convertToRightHandedSystem: boolean,\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(\r\n value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(quaternionCache);\r\n\r\n if (!babylonTransformNode.parent) {\r\n quaternionCache = Quaternion.FromArray([0, 1, 0, 0]).multiply(quaternionCache);\r\n }\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 if (convertToRightHandedSystem && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE) {\r\n _GLTFUtilities._GetRightHandedPositionVector3FromRef(cacheValue);\r\n if (!babylonTransformNode.parent) {\r\n cacheValue.x *= -1;\r\n cacheValue.z *= -1;\r\n }\r\n }\r\n\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 frameDelta The difference between the last and first frame of the animation\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 convertToRightHandedSystem Specifies if the position data should be converted to right handed\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 frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\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, convertToRightHandedSystem, 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 frameDelta The difference between the last and first frame of the animation\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 convertToRightHandedSystem Specifies if the position data should be converted to right handed\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 frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\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(\r\n babylonTransformNode,\r\n _TangentType.INTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(\r\n babylonTransformNode,\r\n _TangentType.OUTTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(\r\n babylonTransformNode: Node,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(basePositionRotationOrScale);\r\n if (!babylonTransformNode.parent) {\r\n basePositionRotationOrScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(basePositionRotationOrScale)).asArray();\r\n }\r\n }\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(basePositionRotationOrScale);\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(basePositionRotationOrScale);\r\n }\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 convertToRightHandedSystem\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 convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let value: number[];\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n let rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(rotationQuaternion);\r\n\r\n if (!babylonTransformNode.parent) {\r\n rotationQuaternion = Quaternion.FromArray([0, 1, 0, 0]).multiply(rotationQuaternion);\r\n }\r\n }\r\n value = rotationQuaternion.asArray();\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(value);\r\n if (!babylonTransformNode.parent) {\r\n value[0] *= -1;\r\n value[2] *= -1;\r\n }\r\n }\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 convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n let posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(posRotScale);\r\n\r\n if (!babylonTransformNode.parent) {\r\n posRotScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(posRotScale);\r\n }\r\n }\r\n outputs.push(posRotScale.asArray());\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalVector3FromRef(newPositionRotationOrScale as Vector3);\r\n\r\n if (!babylonTransformNode.parent) {\r\n newPositionRotationOrScale.x *= -1;\r\n newPositionRotationOrScale.z *= -1;\r\n }\r\n }\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n value = (keyFrame.value as Quaternion).normalize().asArray();\r\n\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(value);\r\n\r\n if (!babylonTransformNode.parent) {\r\n value = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(value)).asArray();\r\n }\r\n }\r\n\r\n outputs.push(value);\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\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 babylonTransformNode\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 frameDelta Time difference between two frames used to scale the tangent by the frame delta\r\n * @param useQuaternion Specifies if quaternions are used\r\n * @param convertToRightHandedSystem Specifies if the values should be converted to right-handed\r\n */\r\n private static _AddSplineTangent(\r\n babylonTransformNode: Node,\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n frameDelta: number,\r\n useQuaternion: boolean,\r\n convertToRightHandedSystem: 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\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(tangent)).asArray();\r\n }\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 if (convertToRightHandedSystem) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent[0] *= -1; // x\r\n tangent[2] *= -1; // z\r\n }\r\n }\r\n }\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":["../../../../../lts/serializers/generated/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 { _BinaryWriter } from \"./glTFExporter\";\r\nimport { _GLTFUtilities } from \"./glTFUtilities\";\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\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 convertToRightHandedSystem - Specifies if the values should be converted to right-handed.\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 convertToRightHandedSystem: boolean,\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 const frameDelta = minMaxKeyFrames.max - minMaxKeyFrames.min;\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 convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else {\r\n if (interpolation === AnimationSamplerInterpolation.LINEAR || interpolation === AnimationSamplerInterpolation.STEP) {\r\n _GLTFAnimation._CreateLinearOrStepAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n } else if (interpolation === AnimationSamplerInterpolation.CUBICSPLINE) {\r\n _GLTFAnimation._CreateCubicSplineAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n frameDelta,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 convertToRightHandedSystem,\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\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: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number,\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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystem\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: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n animationSampleRate: number,\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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\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 * @ignore\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 binaryWriter\r\n * @param bufferViews\r\n * @param accessors\r\n * @param convertToRightHandedSystemMap\r\n * @param animationSampleRate\r\n */\r\n public static _CreateNodeAndMorphAnimationFromAnimationGroups(\r\n babylonScene: Scene,\r\n glTFAnimations: IAnimation[],\r\n nodeMap: { [key: number]: number },\r\n nodes: INode[],\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystemMap: { [nodeId: number]: boolean },\r\n animationSampleRate: number,\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 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 const convertToRightHandedSystem = convertToRightHandedSystemMap[babylonTransformNode.uniqueId];\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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n convertToRightHandedSystem,\r\n animationInfo.useQuaternion,\r\n animationSampleRate\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 as MorphTarget) : (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 binaryWriter,\r\n bufferViews,\r\n accessors,\r\n false,\r\n animationInfo.useQuaternion,\r\n animationSampleRate,\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: { [key: number]: number },\r\n binaryWriter: _BinaryWriter,\r\n bufferViews: IBufferView[],\r\n accessors: IAccessor[],\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean,\r\n animationSampleRate: number,\r\n morphAnimationChannels?: number\r\n ) {\r\n const animationData = _GLTFAnimation._CreateNodeAnimation(\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion,\r\n animationSampleRate\r\n );\r\n let bufferView: IBufferView;\r\n let accessor: IAccessor;\r\n let keyframeAccessorIndex: number;\r\n let dataAccessorIndex: number;\r\n let outputLength: 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[babylonTransformNode.uniqueId];\r\n\r\n // Creates buffer view and accessor for key frames.\r\n let byteLength = animationData.inputs.length * 4;\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} keyframe data view`);\r\n bufferViews.push(bufferView);\r\n animationData.inputs.forEach(function (input) {\r\n binaryWriter.setFloat32(input);\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(\r\n bufferViews.length - 1,\r\n `${name} keyframes`,\r\n AccessorType.SCALAR,\r\n AccessorComponentType.FLOAT,\r\n animationData.inputs.length,\r\n null,\r\n [animationData.inputsMin],\r\n [animationData.inputsMax]\r\n );\r\n accessors.push(accessor);\r\n keyframeAccessorIndex = accessors.length - 1;\r\n\r\n // create bufferview and accessor for keyed values.\r\n outputLength = animationData.outputs.length;\r\n byteLength = _GLTFUtilities._GetDataAccessorElementCount(dataAccessorType) * 4 * animationData.outputs.length;\r\n\r\n // check for in and out tangents\r\n bufferView = _GLTFUtilities._CreateBufferView(0, binaryWriter.getByteOffset(), byteLength, undefined, `${name} data view`);\r\n bufferViews.push(bufferView);\r\n\r\n animationData.outputs.forEach(function (output) {\r\n output.forEach(function (entry) {\r\n binaryWriter.setFloat32(entry);\r\n });\r\n });\r\n\r\n accessor = _GLTFUtilities._CreateAccessor(bufferViews.length - 1, `${name} data`, dataAccessorType, AccessorComponentType.FLOAT, outputLength, null, null, null);\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 convertToRightHandedSystem converts the values to right-handed\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 convertToRightHandedSystem: boolean,\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(\r\n babylonTransformNode,\r\n value,\r\n time,\r\n animation,\r\n animationChannelTargetPath,\r\n quaternionCache,\r\n inputs,\r\n outputs,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ): Vector3 | Quaternion {\r\n const basePositionRotationOrScale = _GLTFAnimation._GetBasePositionRotationOrScale(\r\n babylonTransformNode,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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, or z 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 value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"y\": {\r\n value[componentName] = convertToRightHandedSystem && useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : factor;\r\n break;\r\n }\r\n case \"z\": {\r\n value[componentName] = convertToRightHandedSystem && !useQuaternion && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE ? -factor : 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 convertToRightHandedSystem: boolean,\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(\r\n value as number,\r\n babylonTransformNode,\r\n animation,\r\n animationChannelTargetPath,\r\n convertToRightHandedSystem,\r\n useQuaternion\r\n );\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(quaternionCache);\r\n\r\n if (!babylonTransformNode.parent) {\r\n quaternionCache = Quaternion.FromArray([0, 1, 0, 0]).multiply(quaternionCache);\r\n }\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 if (convertToRightHandedSystem && animationChannelTargetPath !== AnimationChannelTargetPath.SCALE) {\r\n _GLTFUtilities._GetRightHandedPositionVector3FromRef(cacheValue);\r\n if (!babylonTransformNode.parent) {\r\n cacheValue.x *= -1;\r\n cacheValue.z *= -1;\r\n }\r\n }\r\n\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 frameDelta The difference between the last and first frame of the animation\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 convertToRightHandedSystem Specifies if the position data should be converted to right handed\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 frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\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, convertToRightHandedSystem, 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 frameDelta The difference between the last and first frame of the animation\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 convertToRightHandedSystem Specifies if the position data should be converted to right handed\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 frameDelta: number,\r\n inputs: number[],\r\n outputs: number[][],\r\n convertToRightHandedSystem: boolean,\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(\r\n babylonTransformNode,\r\n _TangentType.INTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n _GLTFAnimation._AddKeyframeValue(keyFrame, animation, outputs, animationChannelTargetPath, babylonTransformNode, convertToRightHandedSystem, useQuaternion);\r\n\r\n _GLTFAnimation._AddSplineTangent(\r\n babylonTransformNode,\r\n _TangentType.OUTTANGENT,\r\n outputs,\r\n animationChannelTargetPath,\r\n AnimationSamplerInterpolation.CUBICSPLINE,\r\n keyFrame,\r\n frameDelta,\r\n useQuaternion,\r\n convertToRightHandedSystem\r\n );\r\n });\r\n }\r\n\r\n private static _GetBasePositionRotationOrScale(\r\n babylonTransformNode: Node,\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(basePositionRotationOrScale);\r\n if (!babylonTransformNode.parent) {\r\n basePositionRotationOrScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(basePositionRotationOrScale)).asArray();\r\n }\r\n }\r\n } else {\r\n const r: Vector3 = (babylonTransformNode as TransformNode).rotation;\r\n basePositionRotationOrScale = (r ?? Vector3.Zero()).asArray();\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(basePositionRotationOrScale);\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 if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(basePositionRotationOrScale);\r\n }\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 convertToRightHandedSystem\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 convertToRightHandedSystem: boolean,\r\n useQuaternion: boolean\r\n ) {\r\n let value: number[];\r\n let newPositionRotationOrScale: Nullable<Vector3 | Quaternion | number>;\r\n const animationType = animation.dataType;\r\n if (animationType === Animation.ANIMATIONTYPE_VECTOR3) {\r\n value = keyFrame.value.asArray();\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n const array = Vector3.FromArray(value);\r\n let rotationQuaternion = Quaternion.RotationYawPitchRoll(array.y, array.x, array.z);\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(rotationQuaternion);\r\n\r\n if (!babylonTransformNode.parent) {\r\n rotationQuaternion = Quaternion.FromArray([0, 1, 0, 0]).multiply(rotationQuaternion);\r\n }\r\n }\r\n value = rotationQuaternion.asArray();\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalArray3FromRef(value);\r\n if (!babylonTransformNode.parent) {\r\n value[0] *= -1;\r\n value[2] *= -1;\r\n }\r\n }\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 convertToRightHandedSystem,\r\n useQuaternion\r\n );\r\n if (newPositionRotationOrScale) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.ROTATION) {\r\n let posRotScale = useQuaternion\r\n ? (newPositionRotationOrScale as Quaternion)\r\n : Quaternion.RotationYawPitchRoll(newPositionRotationOrScale.y, newPositionRotationOrScale.x, newPositionRotationOrScale.z).normalize();\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionFromRef(posRotScale);\r\n\r\n if (!babylonTransformNode.parent) {\r\n posRotScale = Quaternion.FromArray([0, 1, 0, 0]).multiply(posRotScale);\r\n }\r\n }\r\n outputs.push(posRotScale.asArray());\r\n } else if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedNormalVector3FromRef(newPositionRotationOrScale as Vector3);\r\n\r\n if (!babylonTransformNode.parent) {\r\n newPositionRotationOrScale.x *= -1;\r\n newPositionRotationOrScale.z *= -1;\r\n }\r\n }\r\n }\r\n outputs.push(newPositionRotationOrScale.asArray());\r\n }\r\n }\r\n } else if (animationType === Animation.ANIMATIONTYPE_QUATERNION) {\r\n value = (keyFrame.value as Quaternion).normalize().asArray();\r\n\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(value);\r\n\r\n if (!babylonTransformNode.parent) {\r\n value = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(value)).asArray();\r\n }\r\n }\r\n\r\n outputs.push(value);\r\n } else {\r\n Tools.Error(\"glTFAnimation: Unsupported key frame values for animation!\");\r\n }\r\n }\r\n\r\n /**\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 babylonTransformNode\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 frameDelta Time difference between two frames used to scale the tangent by the frame delta\r\n * @param useQuaternion Specifies if quaternions are used\r\n * @param convertToRightHandedSystem Specifies if the values should be converted to right-handed\r\n */\r\n private static _AddSplineTangent(\r\n babylonTransformNode: Node,\r\n tangentType: _TangentType,\r\n outputs: number[][],\r\n animationChannelTargetPath: AnimationChannelTargetPath,\r\n interpolation: AnimationSamplerInterpolation,\r\n keyFrame: IAnimationKey,\r\n frameDelta: number,\r\n useQuaternion: boolean,\r\n convertToRightHandedSystem: 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\r\n if (convertToRightHandedSystem) {\r\n _GLTFUtilities._GetRightHandedQuaternionArrayFromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent = Quaternion.FromArray([0, 1, 0, 0]).multiply(Quaternion.FromArray(tangent)).asArray();\r\n }\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 if (convertToRightHandedSystem) {\r\n if (animationChannelTargetPath === AnimationChannelTargetPath.TRANSLATION) {\r\n _GLTFUtilities._GetRightHandedPositionArray3FromRef(tangent);\r\n if (!babylonTransformNode.parent) {\r\n tangent[0] *= -1; // x\r\n tangent[2] *= -1; // z\r\n }\r\n }\r\n }\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"]}
@@ -999,8 +999,8 @@ export class _Exporter {
999
999
  }
1000
1000
  }
1001
1001
  _getVertexBufferFromMesh(attributeKind, bufferMesh) {
1002
- if (bufferMesh.isVerticesDataPresent(attributeKind)) {
1003
- const vertexBuffer = bufferMesh.getVertexBuffer(attributeKind);
1002
+ if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {
1003
+ const vertexBuffer = bufferMesh.getVertexBuffer(attributeKind, true);
1004
1004
  if (vertexBuffer) {
1005
1005
  return vertexBuffer;
1006
1006
  }
@@ -1023,8 +1023,8 @@ export class _Exporter {
1023
1023
  ? babylonTransformNode.sourceMesh
1024
1024
  : null;
1025
1025
  if (bufferMesh) {
1026
- const vertexBuffer = bufferMesh.getVertexBuffer(kind);
1027
- const vertexData = bufferMesh.getVerticesData(kind);
1026
+ const vertexBuffer = bufferMesh.getVertexBuffer(kind, true);
1027
+ const vertexData = bufferMesh.getVerticesData(kind, undefined, undefined, true);
1028
1028
  if (vertexBuffer && vertexData) {
1029
1029
  const typeByteLength = VertexBuffer.GetTypeByteLength(attributeComponentKind);
1030
1030
  const byteLength = vertexData.length * typeByteLength;
@@ -1048,8 +1048,9 @@ export class _Exporter {
1048
1048
  meshPrimitive.targets = [];
1049
1049
  }
1050
1050
  const target = {};
1051
+ const mesh = babylonSubMesh.getMesh();
1051
1052
  if (babylonMorphTarget.hasNormals) {
1052
- const vertexNormals = babylonSubMesh.getMesh().getVerticesData(VertexBuffer.NormalKind);
1053
+ const vertexNormals = mesh.getVerticesData(VertexBuffer.NormalKind, undefined, undefined, true);
1053
1054
  const morphNormals = babylonMorphTarget.getNormals();
1054
1055
  const count = babylonSubMesh.verticesCount;
1055
1056
  const byteStride = 12; // 3 x 4 byte floats
@@ -1063,7 +1064,7 @@ export class _Exporter {
1063
1064
  this.writeMorphTargetAttributeData(VertexBuffer.NormalKind, 5126 /* AccessorComponentType.FLOAT */, babylonSubMesh, babylonMorphTarget, vertexNormals, morphNormals, byteStride / 4, binaryWriter, convertToRightHandedSystem);
1064
1065
  }
1065
1066
  if (babylonMorphTarget.hasPositions) {
1066
- const vertexPositions = babylonSubMesh.getMesh().getVerticesData(VertexBuffer.PositionKind);
1067
+ const vertexPositions = mesh.getVerticesData(VertexBuffer.PositionKind, undefined, undefined, true);
1067
1068
  const morphPositions = babylonMorphTarget.getPositions();
1068
1069
  const count = babylonSubMesh.verticesCount;
1069
1070
  const byteStride = 12; // 3 x 4 byte floats
@@ -1080,7 +1081,7 @@ export class _Exporter {
1080
1081
  accessor.max = minMax.max.asArray();
1081
1082
  }
1082
1083
  if (babylonMorphTarget.hasTangents) {
1083
- const vertexTangents = babylonSubMesh.getMesh().getVerticesData(VertexBuffer.TangentKind);
1084
+ const vertexTangents = mesh.getVerticesData(VertexBuffer.TangentKind, undefined, undefined, true);
1084
1085
  const morphTangents = babylonMorphTarget.getTangents();
1085
1086
  const count = babylonSubMesh.verticesCount;
1086
1087
  const byteStride = 12; // 3 x 4 byte floats
@@ -1240,7 +1241,7 @@ export class _Exporter {
1240
1241
  for (const attribute of attributeData) {
1241
1242
  const attributeKind = attribute.kind;
1242
1243
  const attributeComponentKind = attribute.accessorComponentType;
1243
- if (bufferMesh.isVerticesDataPresent(attributeKind)) {
1244
+ if (bufferMesh.isVerticesDataPresent(attributeKind, true)) {
1244
1245
  const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);
1245
1246
  attribute.byteStride = vertexBuffer
1246
1247
  ? vertexBuffer.getSize() * VertexBuffer.GetTypeByteLength(attribute.accessorComponentType)
@@ -1305,7 +1306,7 @@ export class _Exporter {
1305
1306
  continue;
1306
1307
  }
1307
1308
  }
1308
- const vertexData = bufferMesh.getVerticesData(attributeKind);
1309
+ const vertexData = bufferMesh.getVerticesData(attributeKind, undefined, undefined, true);
1309
1310
  if (vertexData) {
1310
1311
  const vertexBuffer = this._getVertexBufferFromMesh(attributeKind, bufferMesh);
1311
1312
  if (vertexBuffer) {
@@ -1349,7 +1350,7 @@ export class _Exporter {
1349
1350
  }
1350
1351
  else {
1351
1352
  for (const attribute of attributeData) {
1352
- const vertexData = bufferMesh.getVerticesData(attribute.kind);
1353
+ const vertexData = bufferMesh.getVerticesData(attribute.kind, undefined, undefined, true);
1353
1354
  if (vertexData) {
1354
1355
  let byteOffset = this._bufferViews[vertexAttributeBufferViews[attribute.kind]].byteOffset;
1355
1356
  if (!byteOffset) {
@@ -1619,9 +1620,9 @@ export class _Exporter {
1619
1620
  nodeIndex = this._nodes.length - 1;
1620
1621
  nodeMap[babylonNode.uniqueId] = nodeIndex;
1621
1622
  if (!babylonScene.animationGroups.length) {
1622
- _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, convertToRightHandedSystem, this._animationSampleRate);
1623
+ _GLTFAnimation._CreateMorphTargetAnimationFromMorphTargetAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, convertToRightHandedSystem, this._animationSampleRate, this._options.shouldExportAnimation);
1623
1624
  if (babylonNode.animations.length) {
1624
- _GLTFAnimation._CreateNodeAnimationFromNodeAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, convertToRightHandedSystem, this._animationSampleRate);
1625
+ _GLTFAnimation._CreateNodeAnimationFromNodeAnimations(babylonNode, runtimeGLTFAnimation, idleGLTFAnimations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, convertToRightHandedSystem, this._animationSampleRate, this._options.shouldExportAnimation);
1625
1626
  }
1626
1627
  }
1627
1628
  });
@@ -1639,7 +1640,7 @@ export class _Exporter {
1639
1640
  }
1640
1641
  });
1641
1642
  if (babylonScene.animationGroups.length) {
1642
- _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(babylonScene, this._animations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, this._convertToRightHandedSystemMap, this._animationSampleRate);
1643
+ _GLTFAnimation._CreateNodeAndMorphAnimationFromAnimationGroups(babylonScene, this._animations, nodeMap, this._nodes, binaryWriter, this._bufferViews, this._accessors, this._convertToRightHandedSystemMap, this._animationSampleRate, this._options.shouldExportAnimation);
1643
1644
  }
1644
1645
  return nodeMap;
1645
1646
  });