@babylonjs/loaders 5.24.0 → 5.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. package/STL/stlFileLoader.d.ts +4 -4
  2. package/STL/stlFileLoader.js +4 -4
  3. package/STL/stlFileLoader.js.map +1 -1
  4. package/glTF/1.0/glTFBinaryExtension.d.ts +1 -1
  5. package/glTF/1.0/glTFBinaryExtension.js +1 -1
  6. package/glTF/1.0/glTFBinaryExtension.js.map +1 -1
  7. package/glTF/1.0/glTFLoader.d.ts +3 -3
  8. package/glTF/1.0/glTFLoader.js +3 -3
  9. package/glTF/1.0/glTFLoader.js.map +1 -1
  10. package/glTF/1.0/glTFLoaderInterfaces.d.ts +45 -45
  11. package/glTF/1.0/glTFLoaderInterfaces.js +8 -8
  12. package/glTF/1.0/glTFLoaderInterfaces.js.map +1 -1
  13. package/glTF/1.0/glTFLoaderUtils.d.ts +1 -1
  14. package/glTF/1.0/glTFLoaderUtils.js +1 -1
  15. package/glTF/1.0/glTFLoaderUtils.js.map +1 -1
  16. package/glTF/1.0/glTFMaterialsCommonExtension.d.ts +1 -1
  17. package/glTF/1.0/glTFMaterialsCommonExtension.js +1 -1
  18. package/glTF/1.0/glTFMaterialsCommonExtension.js.map +1 -1
  19. package/glTF/2.0/Extensions/EXT_lights_image_based.d.ts +5 -8
  20. package/glTF/2.0/Extensions/EXT_lights_image_based.js +4 -7
  21. package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
  22. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +3 -7
  23. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +3 -7
  24. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  25. package/glTF/2.0/Extensions/EXT_meshopt_compression.d.ts +3 -6
  26. package/glTF/2.0/Extensions/EXT_meshopt_compression.js +3 -6
  27. package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
  28. package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +3 -7
  29. package/glTF/2.0/Extensions/EXT_texture_webp.js +3 -7
  30. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  31. package/glTF/2.0/Extensions/ExtrasAsMetadata.d.ts +5 -15
  32. package/glTF/2.0/Extensions/ExtrasAsMetadata.js +5 -15
  33. package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -1
  34. package/glTF/2.0/Extensions/KHR_animation_pointer.d.ts +14 -35
  35. package/glTF/2.0/Extensions/KHR_animation_pointer.data.d.ts +133 -0
  36. package/glTF/2.0/Extensions/KHR_animation_pointer.data.js +169 -0
  37. package/glTF/2.0/Extensions/KHR_animation_pointer.data.js.map +1 -0
  38. package/glTF/2.0/Extensions/KHR_animation_pointer.js +56 -208
  39. package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -1
  40. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +3 -7
  41. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +3 -7
  42. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  43. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +4 -8
  44. package/glTF/2.0/Extensions/KHR_lights_punctual.js +6 -9
  45. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  46. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +3 -7
  47. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +3 -7
  48. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  49. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +3 -7
  50. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +3 -7
  51. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  52. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +3 -7
  53. package/glTF/2.0/Extensions/KHR_materials_ior.js +3 -7
  54. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +3 -7
  56. package/glTF/2.0/Extensions/KHR_materials_iridescence.js +3 -7
  57. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  58. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.d.ts +3 -7
  59. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +3 -7
  60. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +3 -7
  62. package/glTF/2.0/Extensions/KHR_materials_sheen.js +3 -7
  63. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  64. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +3 -7
  65. package/glTF/2.0/Extensions/KHR_materials_specular.js +3 -7
  66. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  67. package/glTF/2.0/Extensions/KHR_materials_translucency.d.ts +3 -7
  68. package/glTF/2.0/Extensions/KHR_materials_translucency.js +3 -7
  69. package/glTF/2.0/Extensions/KHR_materials_translucency.js.map +1 -1
  70. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +3 -7
  71. package/glTF/2.0/Extensions/KHR_materials_transmission.js +3 -7
  72. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  73. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +3 -7
  74. package/glTF/2.0/Extensions/KHR_materials_unlit.js +3 -7
  75. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  76. package/glTF/2.0/Extensions/KHR_materials_variants.d.ts +4 -11
  77. package/glTF/2.0/Extensions/KHR_materials_variants.js +4 -11
  78. package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
  79. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +3 -7
  80. package/glTF/2.0/Extensions/KHR_materials_volume.js +3 -7
  81. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  82. package/glTF/2.0/Extensions/KHR_mesh_quantization.d.ts +2 -3
  83. package/glTF/2.0/Extensions/KHR_mesh_quantization.js +2 -3
  84. package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -1
  85. package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +3 -7
  86. package/glTF/2.0/Extensions/KHR_texture_basisu.js +3 -7
  87. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  88. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +3 -7
  89. package/glTF/2.0/Extensions/KHR_texture_transform.js +3 -7
  90. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  91. package/glTF/2.0/Extensions/KHR_xmp_json_ld.d.ts +2 -3
  92. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +2 -3
  93. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
  94. package/glTF/2.0/Extensions/MSFT_audio_emitter.d.ts +6 -14
  95. package/glTF/2.0/Extensions/MSFT_audio_emitter.js +6 -14
  96. package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
  97. package/glTF/2.0/Extensions/MSFT_lod.d.ts +8 -26
  98. package/glTF/2.0/Extensions/MSFT_lod.js +8 -26
  99. package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
  100. package/glTF/2.0/Extensions/MSFT_minecraftMesh.d.ts +1 -1
  101. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +1 -1
  102. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
  103. package/glTF/2.0/Extensions/MSFT_sRGBFactors.d.ts +1 -1
  104. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +1 -1
  105. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
  106. package/glTF/2.0/glTFLoader.d.ts +55 -52
  107. package/glTF/2.0/glTFLoader.js +217 -91
  108. package/glTF/2.0/glTFLoader.js.map +1 -1
  109. package/glTF/2.0/glTFLoaderAnimation.d.ts +29 -0
  110. package/glTF/2.0/glTFLoaderAnimation.js +66 -0
  111. package/glTF/2.0/glTFLoaderAnimation.js.map +1 -0
  112. package/glTF/2.0/glTFLoaderExtension.d.ts +20 -7
  113. package/glTF/2.0/glTFLoaderExtension.js.map +1 -1
  114. package/glTF/2.0/glTFLoaderInterfaces.d.ts +58 -31
  115. package/glTF/2.0/glTFLoaderInterfaces.js.map +1 -1
  116. package/glTF/glTFFileLoader.d.ts +20 -53
  117. package/glTF/glTFFileLoader.js +17 -50
  118. package/glTF/glTFFileLoader.js.map +1 -1
  119. package/package.json +3 -3
  120. package/glTF/2.0/Extensions/KHR_animation_pointer.map.d.ts +0 -15
  121. package/glTF/2.0/Extensions/KHR_animation_pointer.map.js +0 -454
  122. package/glTF/2.0/Extensions/KHR_animation_pointer.map.js.map +0 -1
  123. package/glTF/2.0/glTFUtilities.d.ts +0 -7
  124. package/glTF/2.0/glTFUtilities.js +0 -23
  125. package/glTF/2.0/glTFUtilities.js.map +0 -1
@@ -4,6 +4,7 @@ import { Color3 } from "@babylonjs/core/Maths/math.color.js";
4
4
  import { Tools } from "@babylonjs/core/Misc/tools.js";
5
5
  import { Camera } from "@babylonjs/core/Cameras/camera.js";
6
6
  import { FreeCamera } from "@babylonjs/core/Cameras/freeCamera.js";
7
+ import { AnimationKeyInterpolation } from "@babylonjs/core/Animations/animationKey.js";
7
8
  import { AnimationGroup } from "@babylonjs/core/Animations/animationGroup.js";
8
9
  import { Bone } from "@babylonjs/core/Bones/bone.js";
9
10
  import { Skeleton } from "@babylonjs/core/Bones/skeleton.js";
@@ -20,6 +21,27 @@ import { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLo
20
21
  import { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from "@babylonjs/core/Misc/fileTools.js";
21
22
  import { Logger } from "@babylonjs/core/Misc/logger.js";
22
23
  import { BoundingInfo } from "@babylonjs/core/Culling/boundingInfo.js";
24
+ import { nodeAnimationData } from "./glTFLoaderAnimation.js";
25
+ // https://stackoverflow.com/a/48218209
26
+ function mergeDeep(...objects) {
27
+ const isObject = (obj) => obj && typeof obj === "object";
28
+ return objects.reduce((prev, obj) => {
29
+ Object.keys(obj).forEach((key) => {
30
+ const pVal = prev[key];
31
+ const oVal = obj[key];
32
+ if (Array.isArray(pVal) && Array.isArray(oVal)) {
33
+ prev[key] = pVal.concat(...oVal);
34
+ }
35
+ else if (isObject(pVal) && isObject(oVal)) {
36
+ prev[key] = mergeDeep(pVal, oVal);
37
+ }
38
+ else {
39
+ prev[key] = oVal;
40
+ }
41
+ });
42
+ return prev;
43
+ }, {});
44
+ }
23
45
  /**
24
46
  * Helper class for working with arrays when loading the glTF asset
25
47
  */
@@ -49,42 +71,21 @@ export class ArrayItem {
49
71
  }
50
72
  }
51
73
  }
52
- // https://stackoverflow.com/a/48218209
53
- function mergeDeep(...objects) {
54
- const isObject = (obj) => obj && typeof obj === "object";
55
- return objects.reduce((prev, obj) => {
56
- Object.keys(obj).forEach((key) => {
57
- const pVal = prev[key];
58
- const oVal = obj[key];
59
- if (Array.isArray(pVal) && Array.isArray(oVal)) {
60
- prev[key] = pVal.concat(...oVal);
61
- }
62
- else if (isObject(pVal) && isObject(oVal)) {
63
- prev[key] = mergeDeep(pVal, oVal);
64
- }
65
- else {
66
- prev[key] = oVal;
67
- }
68
- });
69
- return prev;
70
- }, {});
71
- }
72
74
  /**
73
75
  * The glTF 2.0 loader
74
76
  */
75
77
  export class GLTFLoader {
76
78
  /**
77
- * @param parent
78
- * @hidden
79
+ * @internal
79
80
  */
80
81
  constructor(parent) {
81
- /** @hidden */
82
+ /** @internal */
82
83
  this._completePromises = new Array();
83
- /** @hidden */
84
+ /** @internal */
84
85
  this._assetContainer = null;
85
86
  /** Storage */
86
87
  this._babylonLights = [];
87
- /** @hidden */
88
+ /** @internal */
88
89
  this._disableInstancedMesh = 0;
89
90
  this._extensions = new Array();
90
91
  this._disposed = false;
@@ -158,7 +159,7 @@ export class GLTFLoader {
158
159
  get rootBabylonMesh() {
159
160
  return this._rootBabylonMesh;
160
161
  }
161
- /** @hidden */
162
+ /** @internal */
162
163
  dispose() {
163
164
  if (this._disposed) {
164
165
  return;
@@ -176,14 +177,7 @@ export class GLTFLoader {
176
177
  this._parent.dispose();
177
178
  }
178
179
  /**
179
- * @param meshesNames
180
- * @param scene
181
- * @param container
182
- * @param data
183
- * @param rootUrl
184
- * @param onProgress
185
- * @param fileName
186
- * @hidden
180
+ * @internal
187
181
  */
188
182
  importMeshAsync(meshesNames, scene, container, data, rootUrl, onProgress, fileName = "") {
189
183
  return Promise.resolve().then(() => {
@@ -223,12 +217,7 @@ export class GLTFLoader {
223
217
  });
224
218
  }
225
219
  /**
226
- * @param scene
227
- * @param data
228
- * @param rootUrl
229
- * @param onProgress
230
- * @param fileName
231
- * @hidden
220
+ * @internal
232
221
  */
233
222
  loadAsync(scene, data, rootUrl, onProgress, fileName = "") {
234
223
  return Promise.resolve().then(() => {
@@ -691,7 +680,7 @@ export class GLTFLoader {
691
680
  });
692
681
  }
693
682
  /**
694
- * @hidden Define this method to modify the default behavior when loading data for mesh primitives.
683
+ * @internal Define this method to modify the default behavior when loading data for mesh primitives.
695
684
  * @param context The context when loading the asset
696
685
  * @param name The mesh name when loading the asset
697
686
  * @param node The glTF node when loading the asset
@@ -1127,6 +1116,7 @@ export class GLTFLoader {
1127
1116
  babylonCamera._parentContainer = this._assetContainer;
1128
1117
  this._babylonScene._blockEntityCollection = false;
1129
1118
  babylonCamera.ignoreParentScaling = true;
1119
+ camera._babylonCamera = babylonCamera;
1130
1120
  babylonCamera.rotation = new Vector3(0, Math.PI, 0);
1131
1121
  switch (camera.type) {
1132
1122
  case "perspective" /* PERSPECTIVE */: {
@@ -1159,8 +1149,6 @@ export class GLTFLoader {
1159
1149
  GLTFLoader.AddPointerMetadata(babylonCamera, context);
1160
1150
  this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);
1161
1151
  assign(babylonCamera);
1162
- // register the camera to be used later.
1163
- camera._babylonCamera = babylonCamera;
1164
1152
  this.logClose();
1165
1153
  return Promise.all(promises).then(() => {
1166
1154
  return babylonCamera;
@@ -1190,32 +1178,190 @@ export class GLTFLoader {
1190
1178
  * @returns A promise that resolves with the loaded Babylon animation group when the load is complete
1191
1179
  */
1192
1180
  loadAnimationAsync(context, animation) {
1193
- // turn everything into pointer
1194
- for (const channel of animation.channels) {
1195
- if (channel.target.path == "pointer" /* POINTER */) {
1196
- continue;
1197
- }
1198
- // decorate the channel with a KHR_animation_pointer extension.
1199
- channel.target.extensions = channel.target.extensions || {};
1200
- channel.target.extensions.KHR_animation_pointer = {
1201
- pointer: `/nodes/${channel.target.node}/${channel.target.path}`,
1202
- };
1203
- channel.target.path = "pointer" /* POINTER */;
1204
- delete channel.target.node;
1205
- // ensure to declare extension used.
1206
- this._gltf.extensionsUsed = this._gltf.extensionsUsed || [];
1207
- if (this._gltf.extensionsUsed.indexOf(GLTFLoader._KHRAnimationPointerName) === -1) {
1208
- this._gltf.extensionsUsed.push(GLTFLoader._KHRAnimationPointerName);
1209
- }
1181
+ const promise = this._extensionsLoadAnimationAsync(context, animation);
1182
+ if (promise) {
1183
+ return promise;
1210
1184
  }
1211
- // create the animation group to be passed to extension.
1212
1185
  this._babylonScene._blockEntityCollection = !!this._assetContainer;
1213
1186
  const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);
1214
1187
  babylonAnimationGroup._parentContainer = this._assetContainer;
1215
1188
  this._babylonScene._blockEntityCollection = false;
1216
1189
  animation._babylonAnimationGroup = babylonAnimationGroup;
1217
- const promise = this._extensionsLoadAnimationAsync(context, animation);
1218
- return promise ?? Promise.resolve(animation._babylonAnimationGroup);
1190
+ const promises = new Array();
1191
+ ArrayItem.Assign(animation.channels);
1192
+ ArrayItem.Assign(animation.samplers);
1193
+ for (const channel of animation.channels) {
1194
+ promises.push(this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, (babylonTarget, babylonAnimation) => {
1195
+ babylonTarget.animations = babylonTarget.animations || [];
1196
+ babylonTarget.animations.push(babylonAnimation);
1197
+ babylonAnimationGroup.addTargetedAnimation(babylonAnimation, babylonTarget);
1198
+ }));
1199
+ }
1200
+ return Promise.all(promises).then(() => {
1201
+ babylonAnimationGroup.normalize(0);
1202
+ return babylonAnimationGroup;
1203
+ });
1204
+ }
1205
+ /**
1206
+ * @hidden
1207
+ * Loads a glTF animation channel.
1208
+ * @param context The context when loading the asset
1209
+ * @param animationContext The context of the animation when loading the asset
1210
+ * @param animation The glTF animation property
1211
+ * @param channel The glTF animation channel property
1212
+ * @param onLoad Called for each animation loaded
1213
+ * @returns A void promise that resolves when the load is complete
1214
+ */
1215
+ _loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {
1216
+ const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad);
1217
+ if (promise) {
1218
+ return promise;
1219
+ }
1220
+ if (channel.target.node == undefined) {
1221
+ return Promise.resolve();
1222
+ }
1223
+ const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);
1224
+ // Ignore animations that have no animation targets.
1225
+ if ((channel.target.path === "weights" /* WEIGHTS */ && !targetNode._numMorphTargets) ||
1226
+ (channel.target.path !== "weights" /* WEIGHTS */ && !targetNode._babylonTransformNode)) {
1227
+ return Promise.resolve();
1228
+ }
1229
+ let properties;
1230
+ switch (channel.target.path) {
1231
+ case "translation" /* TRANSLATION */: {
1232
+ properties = nodeAnimationData.translation;
1233
+ break;
1234
+ }
1235
+ case "rotation" /* ROTATION */: {
1236
+ properties = nodeAnimationData.rotation;
1237
+ break;
1238
+ }
1239
+ case "scale" /* SCALE */: {
1240
+ properties = nodeAnimationData.scale;
1241
+ break;
1242
+ }
1243
+ case "weights" /* WEIGHTS */: {
1244
+ properties = nodeAnimationData.weights;
1245
+ break;
1246
+ }
1247
+ default: {
1248
+ throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);
1249
+ }
1250
+ }
1251
+ const targetInfo = {
1252
+ target: targetNode,
1253
+ properties: properties,
1254
+ };
1255
+ return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad);
1256
+ }
1257
+ /**
1258
+ * @hidden
1259
+ * Loads a glTF animation channel.
1260
+ * @param context The context when loading the asset
1261
+ * @param animationContext The context of the animation when loading the asset
1262
+ * @param animation The glTF animation property
1263
+ * @param channel The glTF animation channel property
1264
+ * @param targetInfo The glTF target and properties
1265
+ * @param onLoad Called for each animation loaded
1266
+ * @returns A void promise that resolves when the load is complete
1267
+ */
1268
+ _loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad) {
1269
+ const fps = this.parent.targetFps;
1270
+ const invfps = 1 / fps;
1271
+ const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);
1272
+ return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then((data) => {
1273
+ let numAnimations = 0;
1274
+ // Extract the corresponding values from the read value.
1275
+ // GLTF values may be dispatched to several Babylon properties.
1276
+ // For example, baseColorFactor [`r`, `g`, `b`, `a`] is dispatched to
1277
+ // - albedoColor as Color3(`r`, `g`, `b`)
1278
+ // - alpha as `a`
1279
+ for (const property of targetInfo.properties) {
1280
+ const stride = property.getStride(targetInfo.target);
1281
+ const input = data.input;
1282
+ const output = data.output;
1283
+ const keys = new Array(input.length);
1284
+ let outputOffset = 0;
1285
+ switch (data.interpolation) {
1286
+ case "STEP" /* STEP */: {
1287
+ for (let index = 0; index < input.length; index++) {
1288
+ const value = property.getValue(targetInfo.target, output, outputOffset, 1);
1289
+ outputOffset += stride;
1290
+ keys[index] = {
1291
+ frame: input[index] * fps,
1292
+ value: value,
1293
+ interpolation: AnimationKeyInterpolation.STEP,
1294
+ };
1295
+ }
1296
+ break;
1297
+ }
1298
+ case "CUBICSPLINE" /* CUBICSPLINE */: {
1299
+ for (let index = 0; index < input.length; index++) {
1300
+ const inTangent = property.getValue(targetInfo.target, output, outputOffset, invfps);
1301
+ outputOffset += stride;
1302
+ const value = property.getValue(targetInfo.target, output, outputOffset, 1);
1303
+ outputOffset += stride;
1304
+ const outTangent = property.getValue(targetInfo.target, output, outputOffset, invfps);
1305
+ outputOffset += stride;
1306
+ keys[index] = {
1307
+ frame: input[index] * fps,
1308
+ inTangent: inTangent,
1309
+ value: value,
1310
+ outTangent: outTangent,
1311
+ };
1312
+ }
1313
+ break;
1314
+ }
1315
+ case "LINEAR" /* LINEAR */: {
1316
+ for (let index = 0; index < input.length; index++) {
1317
+ const value = property.getValue(targetInfo.target, output, outputOffset, 1);
1318
+ outputOffset += stride;
1319
+ keys[index] = {
1320
+ frame: input[index] * fps,
1321
+ value: value,
1322
+ };
1323
+ }
1324
+ break;
1325
+ }
1326
+ }
1327
+ if (outputOffset > 0) {
1328
+ const name = `${animation.name || `animation${animation.index}`}_channel${channel.index}_${numAnimations}`;
1329
+ property.buildAnimations(targetInfo.target, name, fps, keys, (babylonAnimatable, babylonAnimation) => {
1330
+ ++numAnimations;
1331
+ onLoad(babylonAnimatable, babylonAnimation);
1332
+ });
1333
+ }
1334
+ }
1335
+ });
1336
+ }
1337
+ _loadAnimationSamplerAsync(context, sampler) {
1338
+ if (sampler._data) {
1339
+ return sampler._data;
1340
+ }
1341
+ const interpolation = sampler.interpolation || "LINEAR" /* LINEAR */;
1342
+ switch (interpolation) {
1343
+ case "STEP" /* STEP */:
1344
+ case "LINEAR" /* LINEAR */:
1345
+ case "CUBICSPLINE" /* CUBICSPLINE */: {
1346
+ break;
1347
+ }
1348
+ default: {
1349
+ throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);
1350
+ }
1351
+ }
1352
+ const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);
1353
+ const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);
1354
+ sampler._data = Promise.all([
1355
+ this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),
1356
+ this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor),
1357
+ ]).then(([inputData, outputData]) => {
1358
+ return {
1359
+ input: inputData,
1360
+ interpolation: interpolation,
1361
+ output: outputData,
1362
+ };
1363
+ });
1364
+ return sampler._data;
1219
1365
  }
1220
1366
  /**
1221
1367
  * Loads a glTF buffer.
@@ -1330,9 +1476,7 @@ export class GLTFLoader {
1330
1476
  return accessor._data;
1331
1477
  }
1332
1478
  /**
1333
- * @param context
1334
- * @param accessor
1335
- * @hidden
1479
+ * @internal
1336
1480
  */
1337
1481
  _loadFloatAccessorAsync(context, accessor) {
1338
1482
  return this._loadAccessorAsync(context, accessor, Float32Array);
@@ -1435,12 +1579,7 @@ export class GLTFLoader {
1435
1579
  return Promise.all(promises).then(() => { });
1436
1580
  }
1437
1581
  /**
1438
- * @param context
1439
- * @param material
1440
- * @param babylonMesh
1441
- * @param babylonDrawMode
1442
- * @param assign
1443
- * @hidden
1582
+ * @internal
1444
1583
  */
1445
1584
  _loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign = () => { }) {
1446
1585
  const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);
@@ -1642,10 +1781,7 @@ export class GLTFLoader {
1642
1781
  return promise;
1643
1782
  }
1644
1783
  /**
1645
- * @param context
1646
- * @param texture
1647
- * @param assign
1648
- * @hidden
1784
+ * @internal
1649
1785
  */
1650
1786
  _loadTextureAsync(context, texture, assign = () => { }) {
1651
1787
  const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);
@@ -1660,13 +1796,7 @@ export class GLTFLoader {
1660
1796
  return promise;
1661
1797
  }
1662
1798
  /**
1663
- * @param context
1664
- * @param sampler
1665
- * @param image
1666
- * @param assign
1667
- * @param textureLoaderOptions
1668
- * @param useSRGBBuffer
1669
- * @hidden
1799
+ * @internal
1670
1800
  */
1671
1801
  _createTextureAsync(context, sampler, image, assign = () => { }, textureLoaderOptions, useSRGBBuffer) {
1672
1802
  const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);
@@ -1775,7 +1905,6 @@ export class GLTFLoader {
1775
1905
  /**
1776
1906
  * Adds a JSON pointer to the metadata of the Babylon object at `<object>.metadata.gltf.pointers`.
1777
1907
  * @param babylonObject the Babylon object with metadata
1778
- * @param babylonObject.metadata
1779
1908
  * @param pointer the JSON pointer
1780
1909
  */
1781
1910
  static AddPointerMetadata(babylonObject, pointer) {
@@ -1898,9 +2027,7 @@ export class GLTFLoader {
1898
2027
  return Tools.IsBase64(uri) || uri.indexOf("..") === -1;
1899
2028
  }
1900
2029
  /**
1901
- * @param context
1902
- * @param mode
1903
- * @hidden
2030
+ * @internal
1904
2031
  */
1905
2032
  static _GetDrawMode(context, mode) {
1906
2033
  if (mode == undefined) {
@@ -2034,6 +2161,9 @@ export class GLTFLoader {
2034
2161
  _extensionsLoadAnimationAsync(context, animation) {
2035
2162
  return this._applyExtensions(animation, "loadAnimation", (extension) => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));
2036
2163
  }
2164
+ _extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad) {
2165
+ return this._applyExtensions(animation, "loadAnimationChannel", (extension) => extension._loadAnimationChannelAsync && extension._loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad));
2166
+ }
2037
2167
  _extensionsLoadSkinAsync(context, node, skin) {
2038
2168
  return this._applyExtensions(skin, "loadSkin", (extension) => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));
2039
2169
  }
@@ -2127,10 +2257,6 @@ export class GLTFLoader {
2127
2257
  this._parent._endPerformanceCounter(counterName);
2128
2258
  }
2129
2259
  }
2130
- /** @hidden */
2131
- // note : KHR_animation_pointer is used to load animation in ALL case, turning everything
2132
- // into pointer. This is the reason why this value is located here.
2133
- GLTFLoader._KHRAnimationPointerName = "KHR_animation_pointer";
2134
2260
  GLTFLoader._RegisteredExtensions = {};
2135
2261
  /**
2136
2262
  * The default glTF sampler.