@babylonjs/loaders 5.17.1 → 5.20.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.
@@ -20,6 +20,7 @@ export * from "./KHR_mesh_quantization.js";
20
20
  export * from "./KHR_texture_basisu.js";
21
21
  export * from "./KHR_texture_transform.js";
22
22
  export * from "./KHR_xmp_json_ld.js";
23
+ export * from "./KHR_animation_pointer.js";
23
24
  export * from "./MSFT_audio_emitter.js";
24
25
  export * from "./MSFT_lod.js";
25
26
  export * from "./MSFT_minecraftMesh.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../lts/loaders/generated/glTF/2.0/Extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./EXT_lights_image_based\";\r\nexport * from \"./EXT_mesh_gpu_instancing\";\r\nexport * from \"./EXT_meshopt_compression\";\r\nexport * from \"./EXT_texture_webp\";\r\nexport * from \"./KHR_draco_mesh_compression\";\r\nexport * from \"./KHR_lights_punctual\";\r\nexport * from \"./KHR_materials_pbrSpecularGlossiness\";\r\nexport * from \"./KHR_materials_unlit\";\r\nexport * from \"./KHR_materials_clearcoat\";\r\nexport * from \"./KHR_materials_iridescence\";\r\nexport * from \"./KHR_materials_emissive_strength\";\r\nexport * from \"./KHR_materials_sheen\";\r\nexport * from \"./KHR_materials_specular\";\r\nexport * from \"./KHR_materials_ior\";\r\nexport * from \"./KHR_materials_variants\";\r\nexport * from \"./KHR_materials_transmission\";\r\nexport * from \"./KHR_materials_translucency\";\r\nexport * from \"./KHR_materials_volume\";\r\nexport * from \"./KHR_mesh_quantization\";\r\nexport * from \"./KHR_texture_basisu\";\r\nexport * from \"./KHR_texture_transform\";\r\nexport * from \"./KHR_xmp_json_ld\";\r\nexport * from \"./MSFT_audio_emitter\";\r\nexport * from \"./MSFT_lod\";\r\nexport * from \"./MSFT_minecraftMesh\";\r\nexport * from \"./MSFT_sRGBFactors\";\r\nexport * from \"./ExtrasAsMetadata\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../lts/loaders/generated/glTF/2.0/Extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./EXT_lights_image_based\";\r\nexport * from \"./EXT_mesh_gpu_instancing\";\r\nexport * from \"./EXT_meshopt_compression\";\r\nexport * from \"./EXT_texture_webp\";\r\nexport * from \"./KHR_draco_mesh_compression\";\r\nexport * from \"./KHR_lights_punctual\";\r\nexport * from \"./KHR_materials_pbrSpecularGlossiness\";\r\nexport * from \"./KHR_materials_unlit\";\r\nexport * from \"./KHR_materials_clearcoat\";\r\nexport * from \"./KHR_materials_iridescence\";\r\nexport * from \"./KHR_materials_emissive_strength\";\r\nexport * from \"./KHR_materials_sheen\";\r\nexport * from \"./KHR_materials_specular\";\r\nexport * from \"./KHR_materials_ior\";\r\nexport * from \"./KHR_materials_variants\";\r\nexport * from \"./KHR_materials_transmission\";\r\nexport * from \"./KHR_materials_translucency\";\r\nexport * from \"./KHR_materials_volume\";\r\nexport * from \"./KHR_mesh_quantization\";\r\nexport * from \"./KHR_texture_basisu\";\r\nexport * from \"./KHR_texture_transform\";\r\nexport * from \"./KHR_xmp_json_ld\";\r\nexport * from \"./KHR_animation_pointer\";\r\nexport * from \"./MSFT_audio_emitter\";\r\nexport * from \"./MSFT_lod\";\r\nexport * from \"./MSFT_minecraftMesh\";\r\nexport * from \"./MSFT_sRGBFactors\";\r\nexport * from \"./ExtrasAsMetadata\";\r\n"]}
@@ -9,11 +9,10 @@ import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
9
9
  import type { ISceneLoaderAsyncResult, ISceneLoaderProgressEvent } from "@babylonjs/core/Loading/sceneLoader.js";
10
10
  import type { Scene } from "@babylonjs/core/scene.js";
11
11
  import type { IProperty } from "babylonjs-gltf2interface";
12
- import type { IGLTF, ISampler, INode, IScene, IMesh, IAccessor, ICamera, IAnimation, IAnimationChannel, IBuffer, IBufferView, IMaterial, ITextureInfo, ITexture, IImage, IMeshPrimitive, IArrayItem as IArrItem } from "./glTFLoaderInterfaces";
12
+ import type { IGLTF, ISampler, INode, IScene, IMesh, IAccessor, ICamera, IAnimation, IBuffer, IBufferView, IMaterial, ITextureInfo, ITexture, IImage, IMeshPrimitive, IArrayItem as IArrItem } from "./glTFLoaderInterfaces";
13
13
  import type { IGLTFLoaderExtension } from "./glTFLoaderExtension";
14
14
  import type { IGLTFLoader, IGLTFLoaderData } from "../glTFFileLoader";
15
15
  import { GLTFFileLoader } from "../glTFFileLoader";
16
- import type { IAnimatable } from "@babylonjs/core/Animations/animatable.interface.js";
17
16
  import type { IDataBuffer } from "@babylonjs/core/Misc/dataReader.js";
18
17
  import type { Light } from "@babylonjs/core/Lights/light.js";
19
18
  import type { AssetContainer } from "@babylonjs/core/assetContainer.js";
@@ -39,6 +38,8 @@ export declare class ArrayItem {
39
38
  * The glTF 2.0 loader
40
39
  */
41
40
  export declare class GLTFLoader implements IGLTFLoader {
41
+ /** @hidden */
42
+ static readonly _KHRAnimationPointerName = "KHR_animation_pointer";
42
43
  /** @hidden */
43
44
  readonly _completePromises: Promise<any>[];
44
45
  /** @hidden */
@@ -191,18 +192,6 @@ export declare class GLTFLoader implements IGLTFLoader {
191
192
  * @returns A promise that resolves with the loaded Babylon animation group when the load is complete
192
193
  */
193
194
  loadAnimationAsync(context: string, animation: IAnimation): Promise<AnimationGroup>;
194
- /**
195
- * @hidden Loads a glTF animation channel.
196
- * @param context The context when loading the asset
197
- * @param animationContext The context of the animation when loading the asset
198
- * @param animation The glTF animation property
199
- * @param channel The glTF animation channel property
200
- * @param babylonAnimationGroup The babylon animation group property
201
- * @param animationTargetOverride The babylon animation channel target override property. My be null.
202
- * @returns A void promise when the channel load is complete
203
- */
204
- _loadAnimationChannelAsync(context: string, animationContext: string, animation: IAnimation, channel: IAnimationChannel, babylonAnimationGroup: AnimationGroup, animationTargetOverride?: Nullable<IAnimatable>): Promise<void>;
205
- private _loadAnimationSamplerAsync;
206
195
  /**
207
196
  * Loads a glTF buffer.
208
197
  * @param context The context when loading the asset
@@ -5,7 +5,6 @@ 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
7
  import { AnimationGroup } from "@babylonjs/core/Animations/animationGroup.js";
8
- import { Animation } from "@babylonjs/core/Animations/animation.js";
9
8
  import { Bone } from "@babylonjs/core/Bones/bone.js";
10
9
  import { Skeleton } from "@babylonjs/core/Bones/skeleton.js";
11
10
  import { Material } from "@babylonjs/core/Materials/material.js";
@@ -18,7 +17,6 @@ import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
18
17
  import { MorphTarget } from "@babylonjs/core/Morph/morphTarget.js";
19
18
  import { MorphTargetManager } from "@babylonjs/core/Morph/morphTargetManager.js";
20
19
  import { GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from "../glTFFileLoader.js";
21
- import { AnimationKeyInterpolation } from "@babylonjs/core/Animations/animationKey.js";
22
20
  import { DecodeBase64UrlToBinary, IsBase64DataUrl, LoadFileError } from "@babylonjs/core/Misc/fileTools.js";
23
21
  import { Logger } from "@babylonjs/core/Misc/logger.js";
24
22
  import { BoundingInfo } from "@babylonjs/core/Culling/boundingInfo.js";
@@ -1225,6 +1223,8 @@ var GLTFLoader = /** @class */ (function () {
1225
1223
  GLTFLoader.AddPointerMetadata(babylonCamera, context);
1226
1224
  this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);
1227
1225
  assign(babylonCamera);
1226
+ // register the camera to be used later.
1227
+ camera._babylonCamera = babylonCamera;
1228
1228
  this.logClose();
1229
1229
  return Promise.all(promises).then(function () {
1230
1230
  return babylonCamera;
@@ -1254,217 +1254,33 @@ var GLTFLoader = /** @class */ (function () {
1254
1254
  * @returns A promise that resolves with the loaded Babylon animation group when the load is complete
1255
1255
  */
1256
1256
  GLTFLoader.prototype.loadAnimationAsync = function (context, animation) {
1257
- var promise = this._extensionsLoadAnimationAsync(context, animation);
1258
- if (promise) {
1259
- return promise;
1257
+ // turn everything into pointer
1258
+ for (var _i = 0, _a = animation.channels; _i < _a.length; _i++) {
1259
+ var channel = _a[_i];
1260
+ if (channel.target.path == "pointer" /* POINTER */) {
1261
+ continue;
1262
+ }
1263
+ // decorate the channel with a KHR_animation_pointer extension.
1264
+ channel.target.extensions = channel.target.extensions || {};
1265
+ channel.target.extensions.KHR_animation_pointer = {
1266
+ pointer: "/nodes/".concat(channel.target.node, "/").concat(channel.target.path),
1267
+ };
1268
+ channel.target.path = "pointer" /* POINTER */;
1269
+ delete channel.target.node;
1270
+ // ensure to declare extension used.
1271
+ this._gltf.extensionsUsed = this._gltf.extensionsUsed || [];
1272
+ if (this._gltf.extensionsUsed.indexOf(GLTFLoader._KHRAnimationPointerName) === -1) {
1273
+ this._gltf.extensionsUsed.push(GLTFLoader._KHRAnimationPointerName);
1274
+ }
1260
1275
  }
1276
+ // create the animation group to be passed to extension.
1261
1277
  this._babylonScene._blockEntityCollection = !!this._assetContainer;
1262
1278
  var babylonAnimationGroup = new AnimationGroup(animation.name || "animation".concat(animation.index), this._babylonScene);
1263
1279
  babylonAnimationGroup._parentContainer = this._assetContainer;
1264
1280
  this._babylonScene._blockEntityCollection = false;
1265
1281
  animation._babylonAnimationGroup = babylonAnimationGroup;
1266
- var promises = new Array();
1267
- ArrayItem.Assign(animation.channels);
1268
- ArrayItem.Assign(animation.samplers);
1269
- for (var _i = 0, _a = animation.channels; _i < _a.length; _i++) {
1270
- var channel = _a[_i];
1271
- promises.push(this._loadAnimationChannelAsync("".concat(context, "/channels/").concat(channel.index), context, animation, channel, babylonAnimationGroup));
1272
- }
1273
- return Promise.all(promises).then(function () {
1274
- babylonAnimationGroup.normalize(0);
1275
- return babylonAnimationGroup;
1276
- });
1277
- };
1278
- /**
1279
- * @hidden Loads a glTF animation channel.
1280
- * @param context The context when loading the asset
1281
- * @param animationContext The context of the animation when loading the asset
1282
- * @param animation The glTF animation property
1283
- * @param channel The glTF animation channel property
1284
- * @param babylonAnimationGroup The babylon animation group property
1285
- * @param animationTargetOverride The babylon animation channel target override property. My be null.
1286
- * @returns A void promise when the channel load is complete
1287
- */
1288
- GLTFLoader.prototype._loadAnimationChannelAsync = function (context, animationContext, animation, channel, babylonAnimationGroup, animationTargetOverride) {
1289
- var _this = this;
1290
- if (animationTargetOverride === void 0) { animationTargetOverride = null; }
1291
- if (channel.target.node == undefined) {
1292
- return Promise.resolve();
1293
- }
1294
- var targetNode = ArrayItem.Get("".concat(context, "/target/node"), this._gltf.nodes, channel.target.node);
1295
- // Ignore animations that have no animation targets.
1296
- if ((channel.target.path === "weights" /* WEIGHTS */ && !targetNode._numMorphTargets) ||
1297
- (channel.target.path !== "weights" /* WEIGHTS */ && !targetNode._babylonTransformNode)) {
1298
- return Promise.resolve();
1299
- }
1300
- var sampler = ArrayItem.Get("".concat(context, "/sampler"), animation.samplers, channel.sampler);
1301
- return this._loadAnimationSamplerAsync("".concat(animationContext, "/samplers/").concat(channel.sampler), sampler).then(function (data) {
1302
- var targetPath;
1303
- var animationType;
1304
- switch (channel.target.path) {
1305
- case "translation" /* TRANSLATION */: {
1306
- targetPath = "position";
1307
- animationType = Animation.ANIMATIONTYPE_VECTOR3;
1308
- break;
1309
- }
1310
- case "rotation" /* ROTATION */: {
1311
- targetPath = "rotationQuaternion";
1312
- animationType = Animation.ANIMATIONTYPE_QUATERNION;
1313
- break;
1314
- }
1315
- case "scale" /* SCALE */: {
1316
- targetPath = "scaling";
1317
- animationType = Animation.ANIMATIONTYPE_VECTOR3;
1318
- break;
1319
- }
1320
- case "weights" /* WEIGHTS */: {
1321
- targetPath = "influence";
1322
- animationType = Animation.ANIMATIONTYPE_FLOAT;
1323
- break;
1324
- }
1325
- default: {
1326
- throw new Error("".concat(context, "/target/path: Invalid value (").concat(channel.target.path, ")"));
1327
- }
1328
- }
1329
- var outputBufferOffset = 0;
1330
- var getNextOutputValue;
1331
- switch (targetPath) {
1332
- case "position": {
1333
- getNextOutputValue = function (scale) {
1334
- var value = Vector3.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);
1335
- outputBufferOffset += 3;
1336
- return value;
1337
- };
1338
- break;
1339
- }
1340
- case "rotationQuaternion": {
1341
- getNextOutputValue = function (scale) {
1342
- var value = Quaternion.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);
1343
- outputBufferOffset += 4;
1344
- return value;
1345
- };
1346
- break;
1347
- }
1348
- case "scaling": {
1349
- getNextOutputValue = function (scale) {
1350
- var value = Vector3.FromArray(data.output, outputBufferOffset).scaleInPlace(scale);
1351
- outputBufferOffset += 3;
1352
- return value;
1353
- };
1354
- break;
1355
- }
1356
- case "influence": {
1357
- getNextOutputValue = function (scale) {
1358
- var value = new Array(targetNode._numMorphTargets);
1359
- for (var i = 0; i < targetNode._numMorphTargets; i++) {
1360
- value[i] = data.output[outputBufferOffset++] * scale;
1361
- }
1362
- return value;
1363
- };
1364
- break;
1365
- }
1366
- }
1367
- var getNextKey;
1368
- switch (data.interpolation) {
1369
- case "STEP" /* STEP */: {
1370
- getNextKey = function (frameIndex) { return ({
1371
- frame: data.input[frameIndex] * _this.parent.targetFps,
1372
- value: getNextOutputValue(1),
1373
- interpolation: AnimationKeyInterpolation.STEP,
1374
- }); };
1375
- break;
1376
- }
1377
- case "LINEAR" /* LINEAR */: {
1378
- getNextKey = function (frameIndex) { return ({
1379
- frame: data.input[frameIndex] * _this.parent.targetFps,
1380
- value: getNextOutputValue(1),
1381
- }); };
1382
- break;
1383
- }
1384
- case "CUBICSPLINE" /* CUBICSPLINE */: {
1385
- var invTargetFps_1 = 1 / _this.parent.targetFps;
1386
- getNextKey = function (frameIndex) { return ({
1387
- frame: data.input[frameIndex] * _this.parent.targetFps,
1388
- inTangent: getNextOutputValue(invTargetFps_1),
1389
- value: getNextOutputValue(1),
1390
- outTangent: getNextOutputValue(invTargetFps_1),
1391
- }); };
1392
- break;
1393
- }
1394
- }
1395
- var keys = new Array(data.input.length);
1396
- for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
1397
- keys[frameIndex] = getNextKey(frameIndex);
1398
- }
1399
- if (targetPath === "influence") {
1400
- var _loop_2 = function (targetIndex) {
1401
- var animationName = "".concat(babylonAnimationGroup.name, "_channel").concat(babylonAnimationGroup.targetedAnimations.length);
1402
- var babylonAnimation = new Animation(animationName, targetPath, _this.parent.targetFps, animationType);
1403
- babylonAnimation.setKeys(keys.map(function (key) { return ({
1404
- frame: key.frame,
1405
- inTangent: key.inTangent ? key.inTangent[targetIndex] : undefined,
1406
- value: key.value[targetIndex],
1407
- outTangent: key.outTangent ? key.outTangent[targetIndex] : undefined,
1408
- interpolation: key.interpolation,
1409
- }); }));
1410
- _this._forEachPrimitive(targetNode, function (babylonAbstractMesh) {
1411
- var babylonMesh = babylonAbstractMesh;
1412
- if (babylonMesh.morphTargetManager) {
1413
- var morphTarget = babylonMesh.morphTargetManager.getTarget(targetIndex);
1414
- var babylonAnimationClone = babylonAnimation.clone();
1415
- morphTarget.animations.push(babylonAnimationClone);
1416
- babylonAnimationGroup.addTargetedAnimation(babylonAnimationClone, morphTarget);
1417
- }
1418
- });
1419
- };
1420
- for (var targetIndex = 0; targetIndex < targetNode._numMorphTargets; targetIndex++) {
1421
- _loop_2(targetIndex);
1422
- }
1423
- }
1424
- else {
1425
- var animationName = "".concat(babylonAnimationGroup.name, "_channel").concat(babylonAnimationGroup.targetedAnimations.length);
1426
- var babylonAnimation = new Animation(animationName, targetPath, _this.parent.targetFps, animationType);
1427
- babylonAnimation.setKeys(keys);
1428
- if (animationTargetOverride != null && animationTargetOverride.animations != null) {
1429
- animationTargetOverride.animations.push(babylonAnimation);
1430
- babylonAnimationGroup.addTargetedAnimation(babylonAnimation, animationTargetOverride);
1431
- }
1432
- else {
1433
- targetNode._babylonTransformNode.animations.push(babylonAnimation);
1434
- babylonAnimationGroup.addTargetedAnimation(babylonAnimation, targetNode._babylonTransformNode);
1435
- }
1436
- }
1437
- });
1438
- };
1439
- GLTFLoader.prototype._loadAnimationSamplerAsync = function (context, sampler) {
1440
- if (sampler._data) {
1441
- return sampler._data;
1442
- }
1443
- var interpolation = sampler.interpolation || "LINEAR" /* LINEAR */;
1444
- switch (interpolation) {
1445
- case "STEP" /* STEP */:
1446
- case "LINEAR" /* LINEAR */:
1447
- case "CUBICSPLINE" /* CUBICSPLINE */: {
1448
- break;
1449
- }
1450
- default: {
1451
- throw new Error("".concat(context, "/interpolation: Invalid value (").concat(sampler.interpolation, ")"));
1452
- }
1453
- }
1454
- var inputAccessor = ArrayItem.Get("".concat(context, "/input"), this._gltf.accessors, sampler.input);
1455
- var outputAccessor = ArrayItem.Get("".concat(context, "/output"), this._gltf.accessors, sampler.output);
1456
- sampler._data = Promise.all([
1457
- this._loadFloatAccessorAsync("/accessors/".concat(inputAccessor.index), inputAccessor),
1458
- this._loadFloatAccessorAsync("/accessors/".concat(outputAccessor.index), outputAccessor),
1459
- ]).then(function (_a) {
1460
- var inputData = _a[0], outputData = _a[1];
1461
- return {
1462
- input: inputData,
1463
- interpolation: interpolation,
1464
- output: outputData,
1465
- };
1466
- });
1467
- return sampler._data;
1282
+ var promise = this._extensionsLoadAnimationAsync(context, animation);
1283
+ return promise !== null && promise !== void 0 ? promise : Promise.resolve(animation._babylonAnimationGroup);
1468
1284
  };
1469
1285
  /**
1470
1286
  * Loads a glTF buffer.
@@ -2392,6 +2208,10 @@ var GLTFLoader = /** @class */ (function () {
2392
2208
  GLTFLoader.prototype.endPerformanceCounter = function (counterName) {
2393
2209
  this._parent._endPerformanceCounter(counterName);
2394
2210
  };
2211
+ /** @hidden */
2212
+ // note : KHR_animation_pointer is used to load animation in ALL case, turning everything
2213
+ // into pointer. This is the reason why this value is located here.
2214
+ GLTFLoader._KHRAnimationPointerName = "KHR_animation_pointer";
2395
2215
  GLTFLoader._RegisteredExtensions = {};
2396
2216
  /**
2397
2217
  * The default glTF sampler.