@babylonjs/loaders 5.19.0 → 5.22.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.
Files changed (91) hide show
  1. package/OBJ/mtlFileLoader.js +25 -27
  2. package/OBJ/mtlFileLoader.js.map +1 -1
  3. package/OBJ/objFileLoader.js +112 -124
  4. package/OBJ/objFileLoader.js.map +1 -1
  5. package/OBJ/solidParser.js +118 -125
  6. package/OBJ/solidParser.js.map +1 -1
  7. package/STL/stlFileLoader.js +61 -63
  8. package/STL/stlFileLoader.js.map +1 -1
  9. package/glTF/1.0/glTFBinaryExtension.js +26 -30
  10. package/glTF/1.0/glTFBinaryExtension.js.map +1 -1
  11. package/glTF/1.0/glTFLoader.js +409 -432
  12. package/glTF/1.0/glTFLoader.js.map +1 -1
  13. package/glTF/1.0/glTFLoaderUtils.js +33 -37
  14. package/glTF/1.0/glTFLoaderUtils.js.map +1 -1
  15. package/glTF/1.0/glTFMaterialsCommonExtension.js +27 -31
  16. package/glTF/1.0/glTFMaterialsCommonExtension.js.map +1 -1
  17. package/glTF/2.0/Extensions/EXT_lights_image_based.js +48 -59
  18. package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
  19. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +24 -29
  20. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  21. package/glTF/2.0/Extensions/EXT_meshopt_compression.js +13 -16
  22. package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
  23. package/glTF/2.0/Extensions/EXT_texture_webp.js +13 -16
  24. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  25. package/glTF/2.0/Extensions/ExtrasAsMetadata.js +22 -26
  26. package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -1
  27. package/glTF/2.0/Extensions/KHR_animation_pointer.js +63 -76
  28. package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -1
  29. package/glTF/2.0/Extensions/KHR_animation_pointer.map.js +90 -120
  30. package/glTF/2.0/Extensions/KHR_animation_pointer.map.js.map +1 -1
  31. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +25 -28
  32. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  33. package/glTF/2.0/Extensions/KHR_lights_punctual.js +27 -30
  34. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  35. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +25 -28
  36. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  37. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +15 -18
  38. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  39. package/glTF/2.0/Extensions/KHR_materials_ior.js +21 -24
  40. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  41. package/glTF/2.0/Extensions/KHR_materials_iridescence.js +27 -31
  42. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  43. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +24 -27
  44. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
  45. package/glTF/2.0/Extensions/KHR_materials_sheen.js +23 -26
  46. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  47. package/glTF/2.0/Extensions/KHR_materials_specular.js +23 -26
  48. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  49. package/glTF/2.0/Extensions/KHR_materials_translucency.js +20 -23
  50. package/glTF/2.0/Extensions/KHR_materials_translucency.js.map +1 -1
  51. package/glTF/2.0/Extensions/KHR_materials_transmission.js +82 -86
  52. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  53. package/glTF/2.0/Extensions/KHR_materials_unlit.js +19 -22
  54. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_materials_variants.js +79 -97
  56. package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
  57. package/glTF/2.0/Extensions/KHR_materials_volume.js +20 -23
  58. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  59. package/glTF/2.0/Extensions/KHR_mesh_quantization.js +6 -8
  60. package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_texture_basisu.js +13 -16
  62. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  63. package/glTF/2.0/Extensions/KHR_texture_transform.js +12 -15
  64. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  65. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +12 -15
  66. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
  67. package/glTF/2.0/Extensions/MSFT_audio_emitter.js +77 -95
  68. package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
  69. package/glTF/2.0/Extensions/MSFT_lod.js +114 -139
  70. package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
  71. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +12 -15
  72. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
  73. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +12 -15
  74. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
  75. package/glTF/2.0/glTFLoader.js +739 -823
  76. package/glTF/2.0/glTFLoader.js.map +1 -1
  77. package/glTF/glTFFileLoader.js +337 -404
  78. package/glTF/glTFFileLoader.js.map +1 -1
  79. package/glTF/glTFValidation.js +32 -39
  80. package/glTF/glTFValidation.js.map +1 -1
  81. package/legacy/legacy-glTF.js +3 -3
  82. package/legacy/legacy-glTF.js.map +1 -1
  83. package/legacy/legacy-glTF1.js +2 -2
  84. package/legacy/legacy-glTF1.js.map +1 -1
  85. package/legacy/legacy-glTF2.js +12 -12
  86. package/legacy/legacy-glTF2.js.map +1 -1
  87. package/legacy/legacy-objFileLoader.js +2 -2
  88. package/legacy/legacy-objFileLoader.js.map +1 -1
  89. package/legacy/legacy-stlFileLoader.js +2 -2
  90. package/legacy/legacy-stlFileLoader.js.map +1 -1
  91. package/package.json +3 -6
@@ -4,16 +4,16 @@ import { AnimationEvent } from "@babylonjs/core/Animations/animationEvent.js";
4
4
  import { Sound } from "@babylonjs/core/Audio/sound.js";
5
5
  import { WeightedSound } from "@babylonjs/core/Audio/weightedsound.js";
6
6
  import { GLTFLoader, ArrayItem } from "../glTFLoader.js";
7
- var NAME = "MSFT_audio_emitter";
7
+ const NAME = "MSFT_audio_emitter";
8
8
  /**
9
9
  * [Specification](https://github.com/najadojo/glTF/tree/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter)
10
10
  */
11
- var MSFT_audio_emitter = /** @class */ (function () {
11
+ export class MSFT_audio_emitter {
12
12
  /**
13
13
  * @param loader
14
14
  * @hidden
15
15
  */
16
- function MSFT_audio_emitter(loader) {
16
+ constructor(loader) {
17
17
  /**
18
18
  * The name of this extension.
19
19
  */
@@ -22,65 +22,61 @@ var MSFT_audio_emitter = /** @class */ (function () {
22
22
  this.enabled = this._loader.isExtensionUsed(NAME);
23
23
  }
24
24
  /** @hidden */
25
- MSFT_audio_emitter.prototype.dispose = function () {
25
+ dispose() {
26
26
  this._loader = null;
27
27
  this._clips = null;
28
28
  this._emitters = null;
29
- };
29
+ }
30
30
  /** @hidden */
31
- MSFT_audio_emitter.prototype.onLoading = function () {
32
- var extensions = this._loader.gltf.extensions;
31
+ onLoading() {
32
+ const extensions = this._loader.gltf.extensions;
33
33
  if (extensions && extensions[this.name]) {
34
- var extension = extensions[this.name];
34
+ const extension = extensions[this.name];
35
35
  this._clips = extension.clips;
36
36
  this._emitters = extension.emitters;
37
37
  ArrayItem.Assign(this._clips);
38
38
  ArrayItem.Assign(this._emitters);
39
39
  }
40
- };
40
+ }
41
41
  /**
42
42
  * @param context
43
43
  * @param scene
44
44
  * @hidden
45
45
  */
46
- MSFT_audio_emitter.prototype.loadSceneAsync = function (context, scene) {
47
- var _this = this;
48
- return GLTFLoader.LoadExtensionAsync(context, scene, this.name, function (extensionContext, extension) {
49
- var promises = new Array();
50
- promises.push(_this._loader.loadSceneAsync(context, scene));
51
- for (var _i = 0, _a = extension.emitters; _i < _a.length; _i++) {
52
- var emitterIndex = _a[_i];
53
- var emitter = ArrayItem.Get("".concat(extensionContext, "/emitters"), _this._emitters, emitterIndex);
46
+ loadSceneAsync(context, scene) {
47
+ return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => {
48
+ const promises = new Array();
49
+ promises.push(this._loader.loadSceneAsync(context, scene));
50
+ for (const emitterIndex of extension.emitters) {
51
+ const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);
54
52
  if (emitter.refDistance != undefined ||
55
53
  emitter.maxDistance != undefined ||
56
54
  emitter.rolloffFactor != undefined ||
57
55
  emitter.distanceModel != undefined ||
58
56
  emitter.innerAngle != undefined ||
59
57
  emitter.outerAngle != undefined) {
60
- throw new Error("".concat(extensionContext, ": Direction or Distance properties are not allowed on emitters attached to a scene"));
58
+ throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);
61
59
  }
62
- promises.push(_this._loadEmitterAsync("".concat(extensionContext, "/emitters/").concat(emitter.index), emitter));
60
+ promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));
63
61
  }
64
- return Promise.all(promises).then(function () { });
62
+ return Promise.all(promises).then(() => { });
65
63
  });
66
- };
64
+ }
67
65
  /**
68
66
  * @param context
69
67
  * @param node
70
68
  * @param assign
71
69
  * @hidden
72
70
  */
73
- MSFT_audio_emitter.prototype.loadNodeAsync = function (context, node, assign) {
74
- var _this = this;
75
- return GLTFLoader.LoadExtensionAsync(context, node, this.name, function (extensionContext, extension) {
76
- var promises = new Array();
77
- return _this._loader
78
- .loadNodeAsync(extensionContext, node, function (babylonMesh) {
79
- var _loop_1 = function (emitterIndex) {
80
- var emitter = ArrayItem.Get("".concat(extensionContext, "/emitters"), _this._emitters, emitterIndex);
81
- promises.push(_this._loadEmitterAsync("".concat(extensionContext, "/emitters/").concat(emitter.index), emitter).then(function () {
82
- for (var _i = 0, _a = emitter._babylonSounds; _i < _a.length; _i++) {
83
- var sound = _a[_i];
71
+ loadNodeAsync(context, node, assign) {
72
+ return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {
73
+ const promises = new Array();
74
+ return this._loader
75
+ .loadNodeAsync(extensionContext, node, (babylonMesh) => {
76
+ for (const emitterIndex of extension.emitters) {
77
+ const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);
78
+ promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {
79
+ for (const sound of emitter._babylonSounds) {
84
80
  sound.attachToMesh(babylonMesh);
85
81
  if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {
86
82
  sound.setLocalDirectionToMesh(Vector3.Forward());
@@ -88,89 +84,78 @@ var MSFT_audio_emitter = /** @class */ (function () {
88
84
  }
89
85
  }
90
86
  }));
91
- };
92
- for (var _i = 0, _a = extension.emitters; _i < _a.length; _i++) {
93
- var emitterIndex = _a[_i];
94
- _loop_1(emitterIndex);
95
87
  }
96
88
  assign(babylonMesh);
97
89
  })
98
- .then(function (babylonMesh) {
99
- return Promise.all(promises).then(function () {
90
+ .then((babylonMesh) => {
91
+ return Promise.all(promises).then(() => {
100
92
  return babylonMesh;
101
93
  });
102
94
  });
103
95
  });
104
- };
96
+ }
105
97
  /**
106
98
  * @param context
107
99
  * @param animation
108
100
  * @hidden
109
101
  */
110
- MSFT_audio_emitter.prototype.loadAnimationAsync = function (context, animation) {
111
- var _this = this;
112
- return GLTFLoader.LoadExtensionAsync(context, animation, this.name, function (extensionContext, extension) {
113
- return _this._loader.loadAnimationAsync(context, animation).then(function (babylonAnimationGroup) {
114
- var promises = new Array();
102
+ loadAnimationAsync(context, animation) {
103
+ return GLTFLoader.LoadExtensionAsync(context, animation, this.name, (extensionContext, extension) => {
104
+ return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => {
105
+ const promises = new Array();
115
106
  ArrayItem.Assign(extension.events);
116
- for (var _i = 0, _a = extension.events; _i < _a.length; _i++) {
117
- var event_1 = _a[_i];
118
- promises.push(_this._loadAnimationEventAsync("".concat(extensionContext, "/events/").concat(event_1.index), context, animation, event_1, babylonAnimationGroup));
107
+ for (const event of extension.events) {
108
+ promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));
119
109
  }
120
- return Promise.all(promises).then(function () {
110
+ return Promise.all(promises).then(() => {
121
111
  return babylonAnimationGroup;
122
112
  });
123
113
  });
124
114
  });
125
- };
126
- MSFT_audio_emitter.prototype._loadClipAsync = function (context, clip) {
115
+ }
116
+ _loadClipAsync(context, clip) {
127
117
  if (clip._objectURL) {
128
118
  return clip._objectURL;
129
119
  }
130
- var promise;
120
+ let promise;
131
121
  if (clip.uri) {
132
122
  promise = this._loader.loadUriAsync(context, clip, clip.uri);
133
123
  }
134
124
  else {
135
- var bufferView = ArrayItem.Get("".concat(context, "/bufferView"), this._loader.gltf.bufferViews, clip.bufferView);
136
- promise = this._loader.loadBufferViewAsync("/bufferViews/".concat(bufferView.index), bufferView);
125
+ const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);
126
+ promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);
137
127
  }
138
- clip._objectURL = promise.then(function (data) {
128
+ clip._objectURL = promise.then((data) => {
139
129
  return URL.createObjectURL(new Blob([data], { type: clip.mimeType }));
140
130
  });
141
131
  return clip._objectURL;
142
- };
143
- MSFT_audio_emitter.prototype._loadEmitterAsync = function (context, emitter) {
144
- var _this = this;
132
+ }
133
+ _loadEmitterAsync(context, emitter) {
145
134
  emitter._babylonSounds = emitter._babylonSounds || [];
146
135
  if (!emitter._babylonData) {
147
- var clipPromises = new Array();
148
- var name_1 = emitter.name || "emitter".concat(emitter.index);
149
- var options_1 = {
136
+ const clipPromises = new Array();
137
+ const name = emitter.name || `emitter${emitter.index}`;
138
+ const options = {
150
139
  loop: false,
151
140
  autoplay: false,
152
141
  volume: emitter.volume == undefined ? 1 : emitter.volume,
153
142
  };
154
- var _loop_2 = function (i) {
155
- var clipContext = "/extensions/".concat(this_1.name, "/clips");
156
- var clip = ArrayItem.Get(clipContext, this_1._clips, emitter.clips[i].clip);
157
- clipPromises.push(this_1._loadClipAsync("".concat(clipContext, "/").concat(emitter.clips[i].clip), clip).then(function (objectURL) {
158
- var sound = (emitter._babylonSounds[i] = new Sound(name_1, objectURL, _this._loader.babylonScene, null, options_1));
143
+ for (let i = 0; i < emitter.clips.length; i++) {
144
+ const clipContext = `/extensions/${this.name}/clips`;
145
+ const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);
146
+ clipPromises.push(this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL) => {
147
+ const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));
159
148
  sound.refDistance = emitter.refDistance || 1;
160
149
  sound.maxDistance = emitter.maxDistance || 256;
161
150
  sound.rolloffFactor = emitter.rolloffFactor || 1;
162
151
  sound.distanceModel = emitter.distanceModel || "exponential";
163
152
  }));
164
- };
165
- var this_1 = this;
166
- for (var i = 0; i < emitter.clips.length; i++) {
167
- _loop_2(i);
168
153
  }
169
- var promise = Promise.all(clipPromises).then(function () {
170
- var weights = emitter.clips.map(function (clip) {
154
+ const promise = Promise.all(clipPromises).then(() => {
155
+ const weights = emitter.clips.map((clip) => {
171
156
  return clip.weight || 1;
172
157
  });
173
- var weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);
158
+ const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);
174
159
  if (emitter.innerAngle) {
175
160
  weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);
176
161
  }
@@ -187,55 +172,52 @@ var MSFT_audio_emitter = /** @class */ (function () {
187
172
  };
188
173
  }
189
174
  return emitter._babylonData.loaded;
190
- };
191
- MSFT_audio_emitter.prototype._getEventAction = function (context, sound, action, time, startOffset) {
175
+ }
176
+ _getEventAction(context, sound, action, time, startOffset) {
192
177
  switch (action) {
193
178
  case "play" /* play */: {
194
- return function (currentFrame) {
195
- var frameOffset = (startOffset || 0) + (currentFrame - time);
179
+ return (currentFrame) => {
180
+ const frameOffset = (startOffset || 0) + (currentFrame - time);
196
181
  sound.play(frameOffset);
197
182
  };
198
183
  }
199
184
  case "stop" /* stop */: {
200
- return function () {
185
+ return () => {
201
186
  sound.stop();
202
187
  };
203
188
  }
204
189
  case "pause" /* pause */: {
205
- return function () {
190
+ return () => {
206
191
  sound.pause();
207
192
  };
208
193
  }
209
194
  default: {
210
- throw new Error("".concat(context, ": Unsupported action ").concat(action));
195
+ throw new Error(`${context}: Unsupported action ${action}`);
211
196
  }
212
197
  }
213
- };
214
- MSFT_audio_emitter.prototype._loadAnimationEventAsync = function (context, animationContext, animation, event, babylonAnimationGroup) {
215
- var _this = this;
198
+ }
199
+ _loadAnimationEventAsync(context, animationContext, animation, event, babylonAnimationGroup) {
216
200
  if (babylonAnimationGroup.targetedAnimations.length == 0) {
217
201
  return Promise.resolve();
218
202
  }
219
- var babylonAnimation = babylonAnimationGroup.targetedAnimations[0];
220
- var emitterIndex = event.emitter;
221
- var emitter = ArrayItem.Get("/extensions/".concat(this.name, "/emitters"), this._emitters, emitterIndex);
222
- return this._loadEmitterAsync(context, emitter).then(function () {
223
- var sound = emitter._babylonData.sound;
203
+ const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];
204
+ const emitterIndex = event.emitter;
205
+ const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);
206
+ return this._loadEmitterAsync(context, emitter).then(() => {
207
+ const sound = emitter._babylonData.sound;
224
208
  if (sound) {
225
- var babylonAnimationEvent = new AnimationEvent(event.time, _this._getEventAction(context, sound, event.action, event.time, event.startOffset));
209
+ const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));
226
210
  babylonAnimation.animation.addEvent(babylonAnimationEvent);
227
211
  // Make sure all started audio stops when this animation is terminated.
228
- babylonAnimationGroup.onAnimationGroupEndObservable.add(function () {
212
+ babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {
229
213
  sound.stop();
230
214
  });
231
- babylonAnimationGroup.onAnimationGroupPauseObservable.add(function () {
215
+ babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {
232
216
  sound.pause();
233
217
  });
234
218
  }
235
219
  });
236
- };
237
- return MSFT_audio_emitter;
238
- }());
239
- export { MSFT_audio_emitter };
240
- GLTFLoader.RegisterExtension(NAME, function (loader) { return new MSFT_audio_emitter(loader); });
220
+ }
221
+ }
222
+ GLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_audio_emitter(loader));
241
223
  //# sourceMappingURL=MSFT_audio_emitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MSFT_audio_emitter.js","sourceRoot":"","sources":["../../../../../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_audio_emitter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { AnimationEvent } from \"core/Animations/animationEvent\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Sound } from \"core/Audio/sound\";\r\nimport { WeightedSound } from \"core/Audio/weightedsound\";\r\n\r\nimport type { IArrayItem, IScene, INode, IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { IMSFTAudioEmitter_Clip, IMSFTAudioEmitter_Emitter, IMSFTAudioEmitter_EmittersReference, IMSFTAudioEmitter_AnimationEvent } from \"babylonjs-gltf2interface\";\r\nimport { IMSFTAudioEmitter_AnimationEventAction } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"MSFT_audio_emitter\";\r\n\r\ninterface ILoaderClip extends IMSFTAudioEmitter_Clip, IArrayItem {\r\n _objectURL?: Promise<string>;\r\n}\r\n\r\ninterface ILoaderEmitter extends IMSFTAudioEmitter_Emitter, IArrayItem {\r\n _babylonData?: {\r\n sound?: WeightedSound;\r\n loaded: Promise<void>;\r\n };\r\n _babylonSounds: Sound[];\r\n}\r\n\r\ninterface IMSFTAudioEmitter {\r\n clips: ILoaderClip[];\r\n emitters: ILoaderEmitter[];\r\n}\r\n\r\ninterface ILoaderAnimationEvent extends IMSFTAudioEmitter_AnimationEvent, IArrayItem {}\r\n\r\ninterface ILoaderAnimationEvents {\r\n events: ILoaderAnimationEvent[];\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/najadojo/glTF/tree/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter)\r\n */\r\nexport class MSFT_audio_emitter implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _clips: Array<ILoaderClip>;\r\n private _emitters: Array<ILoaderEmitter>;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n (this._clips as any) = null;\r\n (this._emitters as any) = null;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IMSFTAudioEmitter;\r\n\r\n this._clips = extension.clips;\r\n this._emitters = extension.emitters;\r\n\r\n ArrayItem.Assign(this._clips);\r\n ArrayItem.Assign(this._emitters);\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param scene\r\n * @hidden\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference>(context, scene, this.name, (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n if (\r\n emitter.refDistance != undefined ||\r\n emitter.maxDistance != undefined ||\r\n emitter.rolloffFactor != undefined ||\r\n emitter.distanceModel != undefined ||\r\n emitter.innerAngle != undefined ||\r\n emitter.outerAngle != undefined\r\n ) {\r\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\r\n }\r\n\r\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference, TransformNode>(context, node, this.name, (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n return this._loader\r\n .loadNodeAsync(extensionContext, node, (babylonMesh) => {\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n promises.push(\r\n this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\r\n for (const sound of emitter._babylonSounds) {\r\n sound.attachToMesh(babylonMesh);\r\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\r\n sound.setLocalDirectionToMesh(Vector3.Forward());\r\n sound.setDirectionalCone(\r\n 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle),\r\n 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle),\r\n 0\r\n );\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n assign(babylonMesh);\r\n })\r\n .then((babylonMesh) => {\r\n return Promise.all(promises).then(() => {\r\n return babylonMesh;\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param animation\r\n * @hidden\r\n */\r\n public loadAnimationAsync(context: string, animation: IAnimation): Nullable<Promise<AnimationGroup>> {\r\n return GLTFLoader.LoadExtensionAsync<ILoaderAnimationEvents, AnimationGroup>(context, animation, this.name, (extensionContext, extension) => {\r\n return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n ArrayItem.Assign(extension.events);\r\n for (const event of extension.events) {\r\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonAnimationGroup;\r\n });\r\n });\r\n });\r\n }\r\n\r\n private _loadClipAsync(context: string, clip: ILoaderClip): Promise<string> {\r\n if (clip._objectURL) {\r\n return clip._objectURL;\r\n }\r\n\r\n let promise: Promise<ArrayBufferView>;\r\n if (clip.uri) {\r\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\r\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n clip._objectURL = promise.then((data) => {\r\n return URL.createObjectURL(new Blob([data], { type: clip.mimeType }));\r\n });\r\n\r\n return clip._objectURL;\r\n }\r\n\r\n private _loadEmitterAsync(context: string, emitter: ILoaderEmitter): Promise<void> {\r\n emitter._babylonSounds = emitter._babylonSounds || [];\r\n if (!emitter._babylonData) {\r\n const clipPromises = new Array<Promise<any>>();\r\n const name = emitter.name || `emitter${emitter.index}`;\r\n const options = {\r\n loop: false,\r\n autoplay: false,\r\n volume: emitter.volume == undefined ? 1 : emitter.volume,\r\n };\r\n\r\n for (let i = 0; i < emitter.clips.length; i++) {\r\n const clipContext = `/extensions/${this.name}/clips`;\r\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\r\n clipPromises.push(\r\n this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL: string) => {\r\n const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));\r\n sound.refDistance = emitter.refDistance || 1;\r\n sound.maxDistance = emitter.maxDistance || 256;\r\n sound.rolloffFactor = emitter.rolloffFactor || 1;\r\n sound.distanceModel = emitter.distanceModel || \"exponential\";\r\n })\r\n );\r\n }\r\n\r\n const promise = Promise.all(clipPromises).then(() => {\r\n const weights = emitter.clips.map((clip) => {\r\n return clip.weight || 1;\r\n });\r\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\r\n if (emitter.innerAngle) {\r\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\r\n }\r\n if (emitter.outerAngle) {\r\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\r\n }\r\n if (emitter.volume) {\r\n weightedSound.volume = emitter.volume;\r\n }\r\n emitter._babylonData!.sound = weightedSound;\r\n });\r\n\r\n emitter._babylonData = {\r\n loaded: promise,\r\n };\r\n }\r\n\r\n return emitter._babylonData.loaded;\r\n }\r\n\r\n private _getEventAction(\r\n context: string,\r\n sound: WeightedSound,\r\n action: IMSFTAudioEmitter_AnimationEventAction,\r\n time: number,\r\n startOffset?: number\r\n ): (currentFrame: number) => void {\r\n switch (action) {\r\n case IMSFTAudioEmitter_AnimationEventAction.play: {\r\n return (currentFrame: number) => {\r\n const frameOffset = (startOffset || 0) + (currentFrame - time);\r\n sound.play(frameOffset);\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.stop: {\r\n return () => {\r\n sound.stop();\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.pause: {\r\n return () => {\r\n sound.pause();\r\n };\r\n }\r\n default: {\r\n throw new Error(`${context}: Unsupported action ${action}`);\r\n }\r\n }\r\n }\r\n\r\n private _loadAnimationEventAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n event: ILoaderAnimationEvent,\r\n babylonAnimationGroup: AnimationGroup\r\n ): Promise<void> {\r\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\r\n return Promise.resolve();\r\n }\r\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\r\n const emitterIndex = event.emitter;\r\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\r\n return this._loadEmitterAsync(context, emitter).then(() => {\r\n const sound = emitter._babylonData!.sound;\r\n if (sound) {\r\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\r\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\r\n // Make sure all started audio stops when this animation is terminated.\r\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\r\n sound.stop();\r\n });\r\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\r\n sound.pause();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_audio_emitter(loader));\r\n"]}
1
+ {"version":3,"file":"MSFT_audio_emitter.js","sourceRoot":"","sources":["../../../../../../../lts/loaders/generated/glTF/2.0/Extensions/MSFT_audio_emitter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { AnimationEvent } from \"core/Animations/animationEvent\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Sound } from \"core/Audio/sound\";\r\nimport { WeightedSound } from \"core/Audio/weightedsound\";\r\n\r\nimport type { IArrayItem, IScene, INode, IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport type { IMSFTAudioEmitter_Clip, IMSFTAudioEmitter_Emitter, IMSFTAudioEmitter_EmittersReference, IMSFTAudioEmitter_AnimationEvent } from \"babylonjs-gltf2interface\";\r\nimport { IMSFTAudioEmitter_AnimationEventAction } from \"babylonjs-gltf2interface\";\r\n\r\nconst NAME = \"MSFT_audio_emitter\";\r\n\r\ninterface ILoaderClip extends IMSFTAudioEmitter_Clip, IArrayItem {\r\n _objectURL?: Promise<string>;\r\n}\r\n\r\ninterface ILoaderEmitter extends IMSFTAudioEmitter_Emitter, IArrayItem {\r\n _babylonData?: {\r\n sound?: WeightedSound;\r\n loaded: Promise<void>;\r\n };\r\n _babylonSounds: Sound[];\r\n}\r\n\r\ninterface IMSFTAudioEmitter {\r\n clips: ILoaderClip[];\r\n emitters: ILoaderEmitter[];\r\n}\r\n\r\ninterface ILoaderAnimationEvent extends IMSFTAudioEmitter_AnimationEvent, IArrayItem {}\r\n\r\ninterface ILoaderAnimationEvents {\r\n events: ILoaderAnimationEvent[];\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/najadojo/glTF/tree/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter)\r\n */\r\nexport class MSFT_audio_emitter implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _clips: Array<ILoaderClip>;\r\n private _emitters: Array<ILoaderEmitter>;\r\n\r\n /**\r\n * @param loader\r\n * @hidden\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @hidden */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n (this._clips as any) = null;\r\n (this._emitters as any) = null;\r\n }\r\n\r\n /** @hidden */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IMSFTAudioEmitter;\r\n\r\n this._clips = extension.clips;\r\n this._emitters = extension.emitters;\r\n\r\n ArrayItem.Assign(this._clips);\r\n ArrayItem.Assign(this._emitters);\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param scene\r\n * @hidden\r\n */\r\n public loadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference>(context, scene, this.name, (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n if (\r\n emitter.refDistance != undefined ||\r\n emitter.maxDistance != undefined ||\r\n emitter.rolloffFactor != undefined ||\r\n emitter.distanceModel != undefined ||\r\n emitter.innerAngle != undefined ||\r\n emitter.outerAngle != undefined\r\n ) {\r\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\r\n }\r\n\r\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param node\r\n * @param assign\r\n * @hidden\r\n */\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference, TransformNode>(context, node, this.name, (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n return this._loader\r\n .loadNodeAsync(extensionContext, node, (babylonMesh) => {\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n promises.push(\r\n this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\r\n for (const sound of emitter._babylonSounds) {\r\n sound.attachToMesh(babylonMesh);\r\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\r\n sound.setLocalDirectionToMesh(Vector3.Forward());\r\n sound.setDirectionalCone(\r\n 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle),\r\n 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle),\r\n 0\r\n );\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n assign(babylonMesh);\r\n })\r\n .then((babylonMesh) => {\r\n return Promise.all(promises).then(() => {\r\n return babylonMesh;\r\n });\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param animation\r\n * @hidden\r\n */\r\n public loadAnimationAsync(context: string, animation: IAnimation): Nullable<Promise<AnimationGroup>> {\r\n return GLTFLoader.LoadExtensionAsync<ILoaderAnimationEvents, AnimationGroup>(context, animation, this.name, (extensionContext, extension) => {\r\n return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n ArrayItem.Assign(extension.events);\r\n for (const event of extension.events) {\r\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonAnimationGroup;\r\n });\r\n });\r\n });\r\n }\r\n\r\n private _loadClipAsync(context: string, clip: ILoaderClip): Promise<string> {\r\n if (clip._objectURL) {\r\n return clip._objectURL;\r\n }\r\n\r\n let promise: Promise<ArrayBufferView>;\r\n if (clip.uri) {\r\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\r\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n clip._objectURL = promise.then((data) => {\r\n return URL.createObjectURL(new Blob([data], { type: clip.mimeType }));\r\n });\r\n\r\n return clip._objectURL;\r\n }\r\n\r\n private _loadEmitterAsync(context: string, emitter: ILoaderEmitter): Promise<void> {\r\n emitter._babylonSounds = emitter._babylonSounds || [];\r\n if (!emitter._babylonData) {\r\n const clipPromises = new Array<Promise<any>>();\r\n const name = emitter.name || `emitter${emitter.index}`;\r\n const options = {\r\n loop: false,\r\n autoplay: false,\r\n volume: emitter.volume == undefined ? 1 : emitter.volume,\r\n };\r\n\r\n for (let i = 0; i < emitter.clips.length; i++) {\r\n const clipContext = `/extensions/${this.name}/clips`;\r\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\r\n clipPromises.push(\r\n this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL: string) => {\r\n const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));\r\n sound.refDistance = emitter.refDistance || 1;\r\n sound.maxDistance = emitter.maxDistance || 256;\r\n sound.rolloffFactor = emitter.rolloffFactor || 1;\r\n sound.distanceModel = emitter.distanceModel || \"exponential\";\r\n })\r\n );\r\n }\r\n\r\n const promise = Promise.all(clipPromises).then(() => {\r\n const weights = emitter.clips.map((clip) => {\r\n return clip.weight || 1;\r\n });\r\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\r\n if (emitter.innerAngle) {\r\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\r\n }\r\n if (emitter.outerAngle) {\r\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\r\n }\r\n if (emitter.volume) {\r\n weightedSound.volume = emitter.volume;\r\n }\r\n emitter._babylonData!.sound = weightedSound;\r\n });\r\n\r\n emitter._babylonData = {\r\n loaded: promise,\r\n };\r\n }\r\n\r\n return emitter._babylonData.loaded;\r\n }\r\n\r\n private _getEventAction(\r\n context: string,\r\n sound: WeightedSound,\r\n action: IMSFTAudioEmitter_AnimationEventAction,\r\n time: number,\r\n startOffset?: number\r\n ): (currentFrame: number) => void {\r\n switch (action) {\r\n case IMSFTAudioEmitter_AnimationEventAction.play: {\r\n return (currentFrame: number) => {\r\n const frameOffset = (startOffset || 0) + (currentFrame - time);\r\n sound.play(frameOffset);\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.stop: {\r\n return () => {\r\n sound.stop();\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.pause: {\r\n return () => {\r\n sound.pause();\r\n };\r\n }\r\n default: {\r\n throw new Error(`${context}: Unsupported action ${action}`);\r\n }\r\n }\r\n }\r\n\r\n private _loadAnimationEventAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n event: ILoaderAnimationEvent,\r\n babylonAnimationGroup: AnimationGroup\r\n ): Promise<void> {\r\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\r\n return Promise.resolve();\r\n }\r\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\r\n const emitterIndex = event.emitter;\r\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\r\n return this._loadEmitterAsync(context, emitter).then(() => {\r\n const sound = emitter._babylonData!.sound;\r\n if (sound) {\r\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\r\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\r\n // Make sure all started audio stops when this animation is terminated.\r\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\r\n sound.stop();\r\n });\r\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\r\n sound.pause();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_audio_emitter(loader));\r\n"]}