@babylonjs/viewer 7.22.0-alpha → 7.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 (198) hide show
  1. package/configuration/configuration.d.ts +107 -0
  2. package/configuration/configuration.js +16 -0
  3. package/configuration/configuration.js.map +1 -0
  4. package/configuration/configurationCompatibility.d.ts +8 -0
  5. package/configuration/configurationCompatibility.js +66 -0
  6. package/configuration/configurationCompatibility.js.map +1 -0
  7. package/configuration/configurationContainer.d.ts +10 -0
  8. package/configuration/configurationContainer.js +10 -0
  9. package/configuration/configurationContainer.js.map +1 -0
  10. package/configuration/globals.d.ts +6 -0
  11. package/configuration/globals.js +18 -0
  12. package/configuration/globals.js.map +1 -0
  13. package/configuration/index.d.ts +2 -0
  14. package/configuration/index.js +4 -0
  15. package/configuration/index.js.map +1 -0
  16. package/configuration/interfaces/cameraConfiguration.d.ts +31 -0
  17. package/configuration/interfaces/cameraConfiguration.js +2 -0
  18. package/configuration/interfaces/cameraConfiguration.js.map +1 -0
  19. package/configuration/interfaces/colorGradingConfiguration.d.ts +81 -0
  20. package/configuration/interfaces/colorGradingConfiguration.js +2 -0
  21. package/configuration/interfaces/colorGradingConfiguration.js.map +1 -0
  22. package/configuration/interfaces/defaultRenderingPipelineConfiguration.d.ts +20 -0
  23. package/configuration/interfaces/defaultRenderingPipelineConfiguration.js +2 -0
  24. package/configuration/interfaces/defaultRenderingPipelineConfiguration.js.map +1 -0
  25. package/configuration/interfaces/environmentMapConfiguration.d.ts +22 -0
  26. package/configuration/interfaces/environmentMapConfiguration.js +2 -0
  27. package/configuration/interfaces/environmentMapConfiguration.js.map +1 -0
  28. package/configuration/interfaces/groundConfiguration.d.ts +24 -0
  29. package/configuration/interfaces/groundConfiguration.js +2 -0
  30. package/configuration/interfaces/groundConfiguration.js.map +1 -0
  31. package/configuration/interfaces/imageProcessingConfiguration.d.ts +45 -0
  32. package/configuration/interfaces/imageProcessingConfiguration.js +2 -0
  33. package/configuration/interfaces/imageProcessingConfiguration.js.map +1 -0
  34. package/configuration/interfaces/index.d.ts +15 -0
  35. package/configuration/interfaces/index.js +16 -0
  36. package/configuration/interfaces/index.js.map +1 -0
  37. package/configuration/interfaces/lightConfiguration.d.ts +60 -0
  38. package/configuration/interfaces/lightConfiguration.js +2 -0
  39. package/configuration/interfaces/lightConfiguration.js.map +1 -0
  40. package/configuration/interfaces/modelAnimationConfiguration.d.ts +26 -0
  41. package/configuration/interfaces/modelAnimationConfiguration.js +2 -0
  42. package/configuration/interfaces/modelAnimationConfiguration.js.map +1 -0
  43. package/configuration/interfaces/modelConfiguration.d.ts +65 -0
  44. package/configuration/interfaces/modelConfiguration.js +2 -0
  45. package/configuration/interfaces/modelConfiguration.js.map +1 -0
  46. package/configuration/interfaces/observersConfiguration.d.ts +5 -0
  47. package/configuration/interfaces/observersConfiguration.js +2 -0
  48. package/configuration/interfaces/observersConfiguration.js.map +1 -0
  49. package/configuration/interfaces/sceneConfiguration.d.ts +48 -0
  50. package/configuration/interfaces/sceneConfiguration.js +2 -0
  51. package/configuration/interfaces/sceneConfiguration.js.map +1 -0
  52. package/configuration/interfaces/sceneOptimizerConfiguration.d.ts +23 -0
  53. package/configuration/interfaces/sceneOptimizerConfiguration.js +2 -0
  54. package/configuration/interfaces/sceneOptimizerConfiguration.js.map +1 -0
  55. package/configuration/interfaces/skyboxConfiguration.d.ts +21 -0
  56. package/configuration/interfaces/skyboxConfiguration.js +2 -0
  57. package/configuration/interfaces/skyboxConfiguration.js.map +1 -0
  58. package/configuration/interfaces/templateConfiguration.d.ts +67 -0
  59. package/configuration/interfaces/templateConfiguration.js +2 -0
  60. package/configuration/interfaces/templateConfiguration.js.map +1 -0
  61. package/configuration/interfaces/vrConfiguration.d.ts +16 -0
  62. package/configuration/interfaces/vrConfiguration.js +2 -0
  63. package/configuration/interfaces/vrConfiguration.js.map +1 -0
  64. package/configuration/loader.d.ts +4 -0
  65. package/configuration/loader.js +17 -0
  66. package/configuration/loader.js.map +1 -0
  67. package/configuration/mappers.d.ts +43 -0
  68. package/configuration/mappers.js +192 -0
  69. package/configuration/mappers.js.map +1 -0
  70. package/configuration/renderOnlyLoader.d.ts +33 -0
  71. package/configuration/renderOnlyLoader.js +162 -0
  72. package/configuration/renderOnlyLoader.js.map +1 -0
  73. package/configuration/types/default.d.ts +6 -0
  74. package/configuration/types/default.js +121 -0
  75. package/configuration/types/default.js.map +1 -0
  76. package/configuration/types/environmentMap.d.ts +5 -0
  77. package/configuration/types/environmentMap.js +14 -0
  78. package/configuration/types/environmentMap.js.map +1 -0
  79. package/configuration/types/extended.d.ts +6 -0
  80. package/configuration/types/extended.js +317 -0
  81. package/configuration/types/extended.js.map +1 -0
  82. package/configuration/types/index.d.ts +14 -0
  83. package/configuration/types/index.js +51 -0
  84. package/configuration/types/index.js.map +1 -0
  85. package/configuration/types/minimal.d.ts +6 -0
  86. package/configuration/types/minimal.js +43 -0
  87. package/configuration/types/minimal.js.map +1 -0
  88. package/configuration/types/renderOnlyDefault.d.ts +30 -0
  89. package/configuration/types/renderOnlyDefault.js +31 -0
  90. package/configuration/types/renderOnlyDefault.js.map +1 -0
  91. package/configuration/types/shadowLight.d.ts +9 -0
  92. package/configuration/types/shadowLight.js +64 -0
  93. package/configuration/types/shadowLight.js.map +1 -0
  94. package/helper/index.d.ts +29 -0
  95. package/helper/index.js +66 -0
  96. package/helper/index.js.map +1 -0
  97. package/index.d.ts +30 -0
  98. package/index.js +46 -0
  99. package/index.js.map +1 -0
  100. package/initializer.d.ts +11 -0
  101. package/initializer.js +35 -0
  102. package/initializer.js.map +1 -0
  103. package/interfaces.d.ts +5 -0
  104. package/interfaces.js +7 -0
  105. package/interfaces.js.map +1 -0
  106. package/labs/environmentSerializer.d.ts +126 -0
  107. package/labs/environmentSerializer.js +191 -0
  108. package/labs/environmentSerializer.js.map +1 -0
  109. package/labs/texture.d.ts +183 -0
  110. package/labs/texture.js +351 -0
  111. package/labs/texture.js.map +1 -0
  112. package/labs/viewerLabs.d.ts +51 -0
  113. package/labs/viewerLabs.js +134 -0
  114. package/labs/viewerLabs.js.map +1 -0
  115. package/loader/modelLoader.d.ts +56 -0
  116. package/loader/modelLoader.js +199 -0
  117. package/loader/modelLoader.js.map +1 -0
  118. package/loader/plugins/applyMaterialConfig.d.ts +12 -0
  119. package/loader/plugins/applyMaterialConfig.js +16 -0
  120. package/loader/plugins/applyMaterialConfig.js.map +1 -0
  121. package/loader/plugins/extendedMaterialLoaderPlugin.d.ts +9 -0
  122. package/loader/plugins/extendedMaterialLoaderPlugin.js +16 -0
  123. package/loader/plugins/extendedMaterialLoaderPlugin.js.map +1 -0
  124. package/loader/plugins/index.d.ts +19 -0
  125. package/loader/plugins/index.js +44 -0
  126. package/loader/plugins/index.js.map +1 -0
  127. package/loader/plugins/loaderPlugin.d.ts +24 -0
  128. package/loader/plugins/loaderPlugin.js +2 -0
  129. package/loader/plugins/loaderPlugin.js.map +1 -0
  130. package/loader/plugins/msftLodLoaderPlugin.d.ts +12 -0
  131. package/loader/plugins/msftLodLoaderPlugin.js +21 -0
  132. package/loader/plugins/msftLodLoaderPlugin.js.map +1 -0
  133. package/loader/plugins/telemetryLoaderPlugin.d.ts +12 -0
  134. package/loader/plugins/telemetryLoaderPlugin.js +36 -0
  135. package/loader/plugins/telemetryLoaderPlugin.js.map +1 -0
  136. package/managers/observablesManager.d.ts +66 -0
  137. package/managers/observablesManager.js +35 -0
  138. package/managers/observablesManager.js.map +1 -0
  139. package/managers/sceneManager.d.ts +245 -0
  140. package/managers/sceneManager.js +1375 -0
  141. package/managers/sceneManager.js.map +1 -0
  142. package/managers/telemetryManager.d.ts +78 -0
  143. package/managers/telemetryManager.js +117 -0
  144. package/managers/telemetryManager.js.map +1 -0
  145. package/model/modelAnimation.d.ts +215 -0
  146. package/model/modelAnimation.js +237 -0
  147. package/model/modelAnimation.js.map +1 -0
  148. package/model/viewerModel.d.ts +233 -0
  149. package/model/viewerModel.js +673 -0
  150. package/model/viewerModel.js.map +1 -0
  151. package/optimizer/custom/extended.d.ts +13 -0
  152. package/optimizer/custom/extended.js +101 -0
  153. package/optimizer/custom/extended.js.map +1 -0
  154. package/optimizer/custom/index.d.ts +9 -0
  155. package/optimizer/custom/index.js +26 -0
  156. package/optimizer/custom/index.js.map +1 -0
  157. package/package.json +29 -16
  158. package/readme.md +21 -35
  159. package/renderOnlyIndex.d.ts +11 -0
  160. package/renderOnlyIndex.js +18 -0
  161. package/renderOnlyIndex.js.map +1 -0
  162. package/templating/eventManager.d.ts +35 -0
  163. package/templating/eventManager.js +66 -0
  164. package/templating/eventManager.js.map +1 -0
  165. package/templating/plugins/hdButtonPlugin.d.ts +9 -0
  166. package/templating/plugins/hdButtonPlugin.js +21 -0
  167. package/templating/plugins/hdButtonPlugin.js.map +1 -0
  168. package/templating/plugins/printButton.d.ts +9 -0
  169. package/templating/plugins/printButton.js +40 -0
  170. package/templating/plugins/printButton.js.map +1 -0
  171. package/templating/templateManager.d.ts +197 -0
  172. package/templating/templateManager.js +561 -0
  173. package/templating/templateManager.js.map +1 -0
  174. package/templating/viewerTemplatePlugin.d.ts +21 -0
  175. package/templating/viewerTemplatePlugin.js +69 -0
  176. package/templating/viewerTemplatePlugin.js.map +1 -0
  177. package/viewer/defaultViewer.d.ts +130 -0
  178. package/viewer/defaultViewer.js +675 -0
  179. package/viewer/defaultViewer.js.map +1 -0
  180. package/viewer/renderOnlyViewer.d.ts +9 -0
  181. package/viewer/renderOnlyViewer.js +46 -0
  182. package/viewer/renderOnlyViewer.js.map +1 -0
  183. package/viewer/viewer.d.ts +258 -0
  184. package/viewer/viewer.js +783 -0
  185. package/viewer/viewer.js.map +1 -0
  186. package/viewer/viewerManager.d.ts +58 -0
  187. package/viewer/viewerManager.js +91 -0
  188. package/viewer/viewerManager.js.map +1 -0
  189. package/viewer/viewerWithTemplate.d.ts +9 -0
  190. package/viewer/viewerWithTemplate.js +20 -0
  191. package/viewer/viewerWithTemplate.js.map +1 -0
  192. package/dist/babylon-viewer.esm.js +0 -116321
  193. package/dist/babylon-viewer.esm.js.map +0 -1
  194. package/dist/babylon-viewer.esm.min.js +0 -2
  195. package/dist/babylon-viewer.esm.min.js.map +0 -1
  196. package/lib/index.d.ts +0 -132
  197. package/lib/index.js +0 -369
  198. package/lib/index.js.map +0 -1
@@ -0,0 +1,675 @@
1
+ import { __awaiter, __extends, __generator } from "@babylonjs/core/tslib.es6.js";
2
+ import { TemplateManager } from "../templating/templateManager.js";
3
+ import { FilesInput } from "@babylonjs/core/Misc/filesInput.js";
4
+ import { SpotLight } from "@babylonjs/core/Lights/spotLight.js";
5
+ import { Vector3 } from "@babylonjs/core/Maths/math.js";
6
+ import { AbstractViewerWithTemplate } from "./viewerWithTemplate.js";
7
+ import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial.js";
8
+ import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
9
+ // eslint-disable-next-line import/no-internal-modules
10
+ import { extendClassWithConfig } from "../helper/index.js";
11
+ import { AnimationState } from "../model/modelAnimation.js";
12
+ import { HDButtonPlugin } from "../templating/plugins/hdButtonPlugin.js";
13
+ import { PrintButtonPlugin } from "../templating/plugins/printButton.js";
14
+ import { Logger } from "@babylonjs/core/Misc/logger.js";
15
+ import "@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent.js";
16
+ /**
17
+ * The Default viewer is the default implementation of the AbstractViewer.
18
+ * It uses the templating system to render a new canvas and controls.
19
+ */
20
+ var DefaultViewer = /** @class */ (function (_super) {
21
+ __extends(DefaultViewer, _super);
22
+ /**
23
+ * Create a new default viewer
24
+ * @param containerElement the element in which the templates will be rendered
25
+ * @param initialConfiguration the initial configuration. Defaults to extending the default configuration
26
+ */
27
+ function DefaultViewer(containerElement, initialConfiguration) {
28
+ if (initialConfiguration === void 0) { initialConfiguration = { extends: "default" }; }
29
+ var _this = _super.call(this, containerElement, initialConfiguration) || this;
30
+ _this.containerElement = containerElement;
31
+ _this._registeredPlugins = [];
32
+ _this._handlePointerClick = function (event) {
33
+ var pointerDown = event.event;
34
+ if (pointerDown.button !== 0) {
35
+ return;
36
+ }
37
+ var element = event.event.target;
38
+ if (!element) {
39
+ return;
40
+ }
41
+ var parentClasses = element.parentElement.classList;
42
+ var elementClasses = element.classList;
43
+ var elementName = "";
44
+ for (var i = 0; i < elementClasses.length; ++i) {
45
+ var className = elementClasses[i];
46
+ if (className.indexOf("-button") !== -1 || className.indexOf("-wrapper") !== -1) {
47
+ elementName = className;
48
+ break;
49
+ }
50
+ }
51
+ switch (elementName) {
52
+ case "speed-button":
53
+ case "types-button":
54
+ if (parentClasses.contains("open")) {
55
+ parentClasses.remove("open");
56
+ }
57
+ else {
58
+ parentClasses.add("open");
59
+ }
60
+ break;
61
+ case "play-pause-button":
62
+ _this._togglePlayPause();
63
+ break;
64
+ case "label-option-button": {
65
+ var value = element.dataset["value"];
66
+ var label = element.querySelector("span.animation-label");
67
+ if (label && value) {
68
+ _this._updateAnimationType({ value: value.trim(), label: label.innerHTML });
69
+ }
70
+ break;
71
+ }
72
+ case "speed-option-button": {
73
+ if (!_this._currentAnimation) {
74
+ return;
75
+ }
76
+ var speed = element.dataset["value"];
77
+ if (speed) {
78
+ _this._updateAnimationSpeed(speed);
79
+ }
80
+ break;
81
+ }
82
+ case "progress-wrapper":
83
+ _this._resumePlay = !_this._isAnimationPaused;
84
+ if (_this._resumePlay) {
85
+ _this._togglePlayPause(true);
86
+ }
87
+ break;
88
+ case "fullscreen-button":
89
+ _this.toggleFullscreen();
90
+ break;
91
+ case "vr-button":
92
+ _this.toggleVR();
93
+ break;
94
+ default:
95
+ return;
96
+ }
97
+ };
98
+ /**
99
+ * Plays or Pauses animation
100
+ * @param noUiUpdate
101
+ */
102
+ _this._togglePlayPause = function (noUiUpdate) {
103
+ if (!_this._currentAnimation) {
104
+ return;
105
+ }
106
+ if (_this._isAnimationPaused) {
107
+ _this._currentAnimation.restart();
108
+ }
109
+ else {
110
+ _this._currentAnimation.pause();
111
+ }
112
+ _this._isAnimationPaused = !_this._isAnimationPaused;
113
+ if (noUiUpdate) {
114
+ return;
115
+ }
116
+ var navbar = _this.templateManager.getTemplate("navBar");
117
+ if (!navbar) {
118
+ return;
119
+ }
120
+ navbar.updateParams({
121
+ paused: _this._isAnimationPaused,
122
+ });
123
+ };
124
+ /**
125
+ * Control progress bar position based on animation current frame
126
+ */
127
+ _this._updateProgressBar = function () {
128
+ var navbar = _this.templateManager.getTemplate("navBar");
129
+ if (!navbar) {
130
+ return;
131
+ }
132
+ var progressSlider = navbar.parent.querySelector("input.progress-wrapper");
133
+ if (progressSlider && _this._currentAnimation) {
134
+ var progress = (_this._currentAnimation.currentFrame / _this._currentAnimation.frames) * 100;
135
+ var currentValue = progressSlider.valueAsNumber;
136
+ if (Math.abs(currentValue - progress) > 0.5) {
137
+ // Only move if greater than a 1% change
138
+ progressSlider.value = "" + progress;
139
+ }
140
+ if (_this._currentAnimation.state === AnimationState.PLAYING) {
141
+ if (_this.sceneManager.camera.autoRotationBehavior && !_this._oldIdleRotationValue) {
142
+ _this._oldIdleRotationValue = _this.sceneManager.camera.autoRotationBehavior.idleRotationSpeed;
143
+ _this.sceneManager.camera.autoRotationBehavior.idleRotationSpeed = 0;
144
+ }
145
+ }
146
+ else {
147
+ if (_this.sceneManager.camera.autoRotationBehavior && _this._oldIdleRotationValue) {
148
+ _this.sceneManager.camera.autoRotationBehavior.idleRotationSpeed = _this._oldIdleRotationValue;
149
+ _this._oldIdleRotationValue = 0;
150
+ }
151
+ }
152
+ }
153
+ };
154
+ /**
155
+ * Update Current Animation Speed
156
+ * @param speed
157
+ * @param paramsObject
158
+ */
159
+ _this._updateAnimationSpeed = function (speed, paramsObject) {
160
+ var navbar = _this.templateManager.getTemplate("navBar");
161
+ if (!navbar) {
162
+ return;
163
+ }
164
+ if (speed && _this._currentAnimation) {
165
+ _this._currentAnimation.speedRatio = parseFloat(speed);
166
+ if (!_this._isAnimationPaused) {
167
+ _this._currentAnimation.restart();
168
+ }
169
+ if (paramsObject) {
170
+ paramsObject.selectedSpeed = speed + "x";
171
+ }
172
+ else {
173
+ navbar.updateParams({
174
+ selectedSpeed: speed + "x",
175
+ });
176
+ }
177
+ }
178
+ };
179
+ /**
180
+ * Update Current Animation Type
181
+ * @param data
182
+ * @param data.label
183
+ * @param data.value
184
+ * @param paramsObject
185
+ */
186
+ _this._updateAnimationType = function (data, paramsObject) {
187
+ var navbar = _this.templateManager.getTemplate("navBar");
188
+ if (!navbar) {
189
+ return;
190
+ }
191
+ if (data) {
192
+ _this._currentAnimation = _this.sceneManager.models[0].setCurrentAnimationByName(data.value);
193
+ }
194
+ if (paramsObject) {
195
+ paramsObject.selectedAnimation = _this._animationList.indexOf(data.value) + 1;
196
+ paramsObject.selectedAnimationName = data.label;
197
+ }
198
+ else {
199
+ navbar.updateParams({
200
+ selectedAnimation: _this._animationList.indexOf(data.value) + 1,
201
+ selectedAnimationName: data.label,
202
+ });
203
+ }
204
+ _this._updateAnimationSpeed("1.0", paramsObject);
205
+ };
206
+ /**
207
+ * Toggle fullscreen of the entire viewer
208
+ */
209
+ _this.toggleFullscreen = function () {
210
+ var viewerTemplate = _this.templateManager.getTemplate("viewer");
211
+ var viewerElement = viewerTemplate && viewerTemplate.parent;
212
+ var fullscreenElement = _this.fullscreenElement || viewerElement;
213
+ if (fullscreenElement) {
214
+ var currentElement = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
215
+ if (!currentElement) {
216
+ var requestFullScreen = fullscreenElement.requestFullscreen ||
217
+ fullscreenElement.webkitRequestFullscreen ||
218
+ fullscreenElement.msRequestFullscreen ||
219
+ fullscreenElement.mozRequestFullScreen;
220
+ requestFullScreen.call(fullscreenElement);
221
+ if (viewerElement) {
222
+ viewerElement.classList.add("in-fullscreen");
223
+ }
224
+ }
225
+ else {
226
+ var exitFullscreen = document.exitFullscreen || document.webkitExitFullscreen || document.msExitFullscreen || document.mozCancelFullScreen;
227
+ exitFullscreen.call(document);
228
+ if (viewerElement) {
229
+ viewerElement.classList.remove("in-fullscreen");
230
+ }
231
+ }
232
+ }
233
+ };
234
+ _this._onModelLoaded = function (model) {
235
+ _this._configureTemplate(model);
236
+ // with a short timeout, making sure everything is there already.
237
+ var hideLoadingDelay = 20;
238
+ if (_this.configuration.lab && _this.configuration.lab.hideLoadingDelay !== undefined) {
239
+ hideLoadingDelay = _this.configuration.lab.hideLoadingDelay;
240
+ }
241
+ setTimeout(function () {
242
+ _this.sceneManager.scene.executeWhenReady(function () {
243
+ _this.hideLoadingScreen();
244
+ });
245
+ }, hideLoadingDelay);
246
+ return;
247
+ };
248
+ _this.onModelLoadedObservable.add(_this._onModelLoaded);
249
+ _this.onModelRemovedObservable.add(function () {
250
+ _this._configureTemplate();
251
+ });
252
+ _this.onEngineInitObservable.add(function () {
253
+ _this.sceneManager.onLightsConfiguredObservable.add(function () {
254
+ _this._configureLights();
255
+ });
256
+ _this.sceneManager.setDefaultMaterial = function (sceneConfig) {
257
+ var conf = sceneConfig.defaultMaterial;
258
+ if (!conf) {
259
+ return;
260
+ }
261
+ if ((conf.materialType === "standard" && this.scene.defaultMaterial.getClassName() !== "StandardMaterial") ||
262
+ (conf.materialType === "pbr" && this.scene.defaultMaterial.getClassName() !== "PBRMaterial")) {
263
+ this.scene.defaultMaterial.dispose();
264
+ if (conf.materialType === "standard") {
265
+ this.scene.defaultMaterial = new StandardMaterial("defaultMaterial", this.scene);
266
+ }
267
+ else {
268
+ this.scene.defaultMaterial = new PBRMaterial("defaultMaterial", this.scene);
269
+ }
270
+ }
271
+ extendClassWithConfig(this.scene.defaultMaterial, conf);
272
+ };
273
+ if (!_this.sceneManager.models.length) {
274
+ _this.hideLoadingScreen();
275
+ }
276
+ });
277
+ return _this;
278
+ }
279
+ DefaultViewer.prototype.registerTemplatePlugin = function (plugin) {
280
+ var _this = this;
281
+ //validate
282
+ if (!plugin.templateName) {
283
+ throw new Error("No template name provided");
284
+ }
285
+ this._registeredPlugins.push(plugin);
286
+ var template = this.templateManager.getTemplate(plugin.templateName);
287
+ if (!template) {
288
+ throw new Error("Template ".concat(plugin.templateName, " not found"));
289
+ }
290
+ if (plugin.addHTMLTemplate) {
291
+ template.onHTMLRendered.add(function (tmpl) {
292
+ plugin.addHTMLTemplate(tmpl);
293
+ });
294
+ template.redraw();
295
+ }
296
+ if (plugin.eventsToAttach) {
297
+ plugin.eventsToAttach.forEach(function (eventName) {
298
+ plugin.onEvent &&
299
+ _this.templateManager.eventManager.registerCallback(plugin.templateName, function (event) {
300
+ if (plugin.onEvent && plugin.interactionPredicate(event)) {
301
+ plugin.onEvent(event);
302
+ }
303
+ }, eventName);
304
+ });
305
+ }
306
+ };
307
+ /**
308
+ * This will be executed when the templates initialize.
309
+ * @returns a promise that will be resolved when the templates are loaded
310
+ */
311
+ DefaultViewer.prototype._onTemplatesLoaded = function () {
312
+ var _this = this;
313
+ this.showLoadingScreen();
314
+ // navbar
315
+ this._initNavbar();
316
+ // close overlay button
317
+ var template = this.templateManager.getTemplate("overlay");
318
+ if (template) {
319
+ var closeButton = template.parent.querySelector(".close-button");
320
+ if (closeButton) {
321
+ closeButton.addEventListener("pointerdown", function () {
322
+ _this.hideOverlayScreen();
323
+ });
324
+ }
325
+ }
326
+ if (this.configuration.templates && this.configuration.templates.viewer) {
327
+ if (this.configuration.templates.viewer.params && this.configuration.templates.viewer.params.enableDragAndDrop) {
328
+ this.onSceneInitObservable.addOnce(function () {
329
+ var filesInput = new FilesInput(_this.engine, _this.sceneManager.scene, function () { }, function () { }, function () { }, function () { }, function () { }, function (file) {
330
+ _this.loadModel(file);
331
+ }, function () { });
332
+ filesInput.monitorElementForDragNDrop(_this.templateManager.getCanvas());
333
+ });
334
+ }
335
+ }
336
+ return _super.prototype._onTemplatesLoaded.call(this);
337
+ };
338
+ DefaultViewer.prototype._initNavbar = function () {
339
+ var _this = this;
340
+ var navbar = this.templateManager.getTemplate("navBar");
341
+ if (navbar) {
342
+ this.onFrameRenderedObservable.add(this._updateProgressBar);
343
+ this.templateManager.eventManager.registerCallback("navBar", this._handlePointerClick, "click");
344
+ // an example how to trigger the help button. publiclly available
345
+ this.templateManager.eventManager.registerCallback("navBar", function () {
346
+ // do your thing
347
+ }, "pointerdown", ".help-button");
348
+ this.templateManager.eventManager.registerCallback("navBar", function (event) {
349
+ var evt = event.event;
350
+ var element = evt.target;
351
+ if (!_this._currentAnimation) {
352
+ return;
353
+ }
354
+ var gotoFrame = (+element.value / 100) * _this._currentAnimation.frames;
355
+ if (isNaN(gotoFrame)) {
356
+ return;
357
+ }
358
+ _this._currentAnimation.goToFrame(gotoFrame);
359
+ }, "input");
360
+ this.templateManager.eventManager.registerCallback("navBar", function () {
361
+ if (_this._resumePlay) {
362
+ _this._togglePlayPause(true);
363
+ }
364
+ _this._resumePlay = false;
365
+ }, "pointerup", ".progress-wrapper");
366
+ if (window.devicePixelRatio === 1 && navbar.configuration.params && !navbar.configuration.params.hideHdButton) {
367
+ navbar.updateParams({
368
+ hideHdButton: true,
369
+ });
370
+ }
371
+ this.registerTemplatePlugin(new HDButtonPlugin(this));
372
+ this.registerTemplatePlugin(new PrintButtonPlugin(this));
373
+ }
374
+ };
375
+ DefaultViewer.prototype._initVR = function () {
376
+ var _this = this;
377
+ if (this.sceneManager.vrHelper) {
378
+ // due to the way the experience helper is exisintg VR, this must be added.
379
+ this.sceneManager.vrHelper.onExitingVR.add(function () {
380
+ var viewerTemplate = _this.templateManager.getTemplate("viewer");
381
+ var viewerElement = viewerTemplate && viewerTemplate.parent;
382
+ if (viewerElement) {
383
+ viewerElement.classList.remove("in-vr");
384
+ }
385
+ });
386
+ }
387
+ _super.prototype._initVR.call(this);
388
+ };
389
+ /**
390
+ * Preparing the container element to present the viewer
391
+ */
392
+ DefaultViewer.prototype._prepareContainerElement = function () {
393
+ var htmlElement = this.containerElement;
394
+ if (htmlElement.style) {
395
+ htmlElement.style.position = "relative";
396
+ htmlElement.style.height = "100%";
397
+ htmlElement.style.display = "flex";
398
+ }
399
+ };
400
+ /**
401
+ * This function will configure the templates and update them after a model was loaded
402
+ * It is mainly responsible to changing the title and subtitle etc'.
403
+ * @param model the model to be used to configure the templates by
404
+ */
405
+ DefaultViewer.prototype._configureTemplate = function (model) {
406
+ var navbar = this.templateManager.getTemplate("navBar");
407
+ if (!navbar) {
408
+ return;
409
+ }
410
+ var newParams = navbar.configuration.params || {};
411
+ if (!model) {
412
+ newParams.animations = null;
413
+ }
414
+ else {
415
+ var animationNames = model.getAnimationNames();
416
+ newParams.animations = animationNames.map(function (a) {
417
+ return { label: a, value: a };
418
+ });
419
+ if (animationNames.length) {
420
+ this._isAnimationPaused = (model.configuration.animation && !model.configuration.animation.autoStart) || !model.configuration.animation;
421
+ this._animationList = animationNames;
422
+ newParams.paused = this._isAnimationPaused;
423
+ var animationIndex = 0;
424
+ if (model.configuration.animation && typeof model.configuration.animation.autoStart === "string") {
425
+ animationIndex = animationNames.indexOf(model.configuration.animation.autoStart);
426
+ if (animationIndex === -1) {
427
+ animationIndex = 0;
428
+ }
429
+ }
430
+ this._updateAnimationType(newParams.animations[animationIndex], newParams);
431
+ }
432
+ else {
433
+ newParams.animations = null;
434
+ }
435
+ if (model.configuration.thumbnail) {
436
+ newParams.logoImage = model.configuration.thumbnail;
437
+ }
438
+ }
439
+ navbar.updateParams(newParams, false);
440
+ };
441
+ /**
442
+ * This will load a new model to the default viewer
443
+ * overriding the AbstractViewer's loadModel.
444
+ * The scene will automatically be cleared of the old models, if exist.
445
+ * @param model the configuration object (or URL) to load.
446
+ * @returns a promise that will be resolved when the model is loaded
447
+ */
448
+ DefaultViewer.prototype.loadModel = function (model) {
449
+ return __awaiter(this, void 0, void 0, function () {
450
+ var error_1;
451
+ return __generator(this, function (_a) {
452
+ switch (_a.label) {
453
+ case 0:
454
+ if (!model) {
455
+ model = this.configuration.model;
456
+ }
457
+ this.showLoadingScreen();
458
+ _a.label = 1;
459
+ case 1:
460
+ _a.trys.push([1, 3, , 5]);
461
+ return [4 /*yield*/, _super.prototype.loadModel.call(this, model, true)];
462
+ case 2: return [2 /*return*/, _a.sent()];
463
+ case 3:
464
+ error_1 = _a.sent();
465
+ Logger.Log(error_1);
466
+ this.hideLoadingScreen();
467
+ this.showOverlayScreen("error");
468
+ return [4 /*yield*/, Promise.reject(error_1)];
469
+ case 4: return [2 /*return*/, _a.sent()];
470
+ case 5: return [2 /*return*/];
471
+ }
472
+ });
473
+ });
474
+ };
475
+ /**
476
+ * Show the overlay and the defined sub-screen.
477
+ * Mainly used for help and errors
478
+ * @param subScreen the name of the subScreen. Those can be defined in the configuration object
479
+ * @returns a promise that will be resolved when the overlay is shown
480
+ */
481
+ DefaultViewer.prototype.showOverlayScreen = function (subScreen) {
482
+ var _this = this;
483
+ var template = this.templateManager.getTemplate("overlay");
484
+ if (!template) {
485
+ return Promise.resolve("Overlay template not found");
486
+ }
487
+ return template.show(function (template) {
488
+ var canvasRect = _this.containerElement.getBoundingClientRect();
489
+ template.parent.style.display = "flex";
490
+ template.parent.style.width = canvasRect.width + "px";
491
+ template.parent.style.height = canvasRect.height + "px";
492
+ template.parent.style.opacity = "1";
493
+ var subTemplate = _this.templateManager.getTemplate(subScreen);
494
+ if (!subTemplate) {
495
+ return Promise.reject(subScreen + " template not found");
496
+ }
497
+ return subTemplate.show(function (template) {
498
+ template.parent.style.display = "flex";
499
+ return Promise.resolve(template);
500
+ });
501
+ });
502
+ };
503
+ /**
504
+ * Hide the overlay screen.
505
+ * @returns a promise that will be resolved when the overlay is hidden
506
+ */
507
+ DefaultViewer.prototype.hideOverlayScreen = function () {
508
+ var template = this.templateManager.getTemplate("overlay");
509
+ if (!template) {
510
+ return Promise.resolve("Overlay template not found");
511
+ }
512
+ return template.hide(function (template) {
513
+ template.parent.style.opacity = "0";
514
+ var onTransitionEnd = function () {
515
+ template.parent.removeEventListener("transitionend", onTransitionEnd);
516
+ template.parent.style.display = "none";
517
+ };
518
+ template.parent.addEventListener("transitionend", onTransitionEnd);
519
+ var overlays = template.parent.querySelectorAll(".overlay");
520
+ if (overlays) {
521
+ for (var i = 0; i < overlays.length; ++i) {
522
+ var htmlElement = overlays.item(i);
523
+ htmlElement.style.display = "none";
524
+ }
525
+ }
526
+ return Promise.resolve(template);
527
+ });
528
+ };
529
+ /**
530
+ * show the viewer (in case it was hidden)
531
+ *
532
+ * @param visibilityFunction an optional function to execute in order to show the container
533
+ * @returns a promise that will be resolved when the viewer is shown
534
+ */
535
+ DefaultViewer.prototype.show = function (visibilityFunction) {
536
+ var template = this.templateManager.getTemplate("main");
537
+ //not possible, but yet:
538
+ if (!template) {
539
+ return Promise.reject("Main template not found");
540
+ }
541
+ return template.show(visibilityFunction);
542
+ };
543
+ /**
544
+ * hide the viewer (in case it is visible)
545
+ *
546
+ * @param visibilityFunction an optional function to execute in order to hide the container
547
+ * @returns a promise that will be resolved when the viewer is hidden
548
+ */
549
+ DefaultViewer.prototype.hide = function (visibilityFunction) {
550
+ var template = this.templateManager.getTemplate("main");
551
+ //not possible, but yet:
552
+ if (!template) {
553
+ return Promise.reject("Main template not found");
554
+ }
555
+ return template.hide(visibilityFunction);
556
+ };
557
+ /**
558
+ * Show the loading screen.
559
+ * The loading screen can be configured using the configuration object
560
+ * @returns a promise that will be resolved when the loading screen is shown
561
+ */
562
+ DefaultViewer.prototype.showLoadingScreen = function () {
563
+ var _this = this;
564
+ var template = this.templateManager.getTemplate("loadingScreen");
565
+ if (!template) {
566
+ return Promise.resolve("Loading Screen template not found");
567
+ }
568
+ return template.show(function (template) {
569
+ var canvasRect = _this.containerElement.getBoundingClientRect();
570
+ // var canvasPositioning = window.getComputedStyle(this.containerElement).position;
571
+ template.parent.style.display = "flex";
572
+ template.parent.style.width = canvasRect.width + "px";
573
+ template.parent.style.height = canvasRect.height + "px";
574
+ template.parent.style.opacity = "1";
575
+ // from the configuration!!!
576
+ var color = "black";
577
+ if (_this.configuration.templates && _this.configuration.templates.loadingScreen) {
578
+ color = (_this.configuration.templates.loadingScreen.params && _this.configuration.templates.loadingScreen.params.backgroundColor) || color;
579
+ }
580
+ template.parent.style.backgroundColor = color;
581
+ return Promise.resolve(template);
582
+ });
583
+ };
584
+ /**
585
+ * Hide the loading screen
586
+ * @returns a promise that will be resolved when the loading screen is hidden
587
+ */
588
+ DefaultViewer.prototype.hideLoadingScreen = function () {
589
+ var template = this.templateManager.getTemplate("loadingScreen");
590
+ if (!template) {
591
+ return Promise.resolve("Loading Screen template not found");
592
+ }
593
+ return template.hide(function (template) {
594
+ template.parent.style.opacity = "0";
595
+ var onTransitionEnd = function () {
596
+ template.parent.removeEventListener("transitionend", onTransitionEnd);
597
+ template.parent.style.display = "none";
598
+ };
599
+ template.parent.addEventListener("transitionend", onTransitionEnd);
600
+ return Promise.resolve(template);
601
+ });
602
+ };
603
+ DefaultViewer.prototype.dispose = function () {
604
+ this.templateManager.dispose();
605
+ _super.prototype.dispose.call(this);
606
+ };
607
+ DefaultViewer.prototype._onConfigurationLoaded = function (configuration) {
608
+ var _this = this;
609
+ _super.prototype._onConfigurationLoaded.call(this, configuration);
610
+ this.templateManager = new TemplateManager(this.containerElement);
611
+ // initialize the templates
612
+ var templateConfiguration = this.configuration.templates || {};
613
+ this.templateManager.initTemplate(templateConfiguration);
614
+ // when done, execute onTemplatesLoaded()
615
+ this.templateManager.onAllLoaded.add(function () {
616
+ var canvas = _this.templateManager.getCanvas();
617
+ if (canvas) {
618
+ _this._canvas = canvas;
619
+ }
620
+ _this._onTemplateLoaded();
621
+ });
622
+ };
623
+ /**
624
+ * An extension of the light configuration of the abstract viewer.
625
+ */
626
+ DefaultViewer.prototype._configureLights = function () {
627
+ var _this = this;
628
+ // labs feature - flashlight
629
+ if (this.configuration.lab && this.configuration.lab.flashlight) {
630
+ var lightTarget_1;
631
+ var angle = 0.5;
632
+ var exponent = Math.PI / 2;
633
+ if (typeof this.configuration.lab.flashlight === "object") {
634
+ exponent = this.configuration.lab.flashlight.exponent || exponent;
635
+ angle = this.configuration.lab.flashlight.angle || angle;
636
+ }
637
+ var flashlight_1 = new SpotLight("flashlight", Vector3.Zero(), Vector3.Zero(), exponent, angle, this.sceneManager.scene);
638
+ if (typeof this.configuration.lab.flashlight === "object") {
639
+ flashlight_1.intensity = this.configuration.lab.flashlight.intensity || flashlight_1.intensity;
640
+ if (this.configuration.lab.flashlight.diffuse) {
641
+ flashlight_1.diffuse.r = this.configuration.lab.flashlight.diffuse.r;
642
+ flashlight_1.diffuse.g = this.configuration.lab.flashlight.diffuse.g;
643
+ flashlight_1.diffuse.b = this.configuration.lab.flashlight.diffuse.b;
644
+ }
645
+ if (this.configuration.lab.flashlight.specular) {
646
+ flashlight_1.specular.r = this.configuration.lab.flashlight.specular.r;
647
+ flashlight_1.specular.g = this.configuration.lab.flashlight.specular.g;
648
+ flashlight_1.specular.b = this.configuration.lab.flashlight.specular.b;
649
+ }
650
+ }
651
+ this.sceneManager.scene.constantlyUpdateMeshUnderPointer = true;
652
+ this.sceneManager.scene.onPointerObservable.add(function (eventData) {
653
+ if (eventData.type === 4 && eventData.pickInfo) {
654
+ lightTarget_1 = eventData.pickInfo.pickedPoint;
655
+ }
656
+ else {
657
+ lightTarget_1 = undefined;
658
+ }
659
+ });
660
+ var updateFlashlightFunction = function () {
661
+ if (_this.sceneManager.camera && flashlight_1) {
662
+ flashlight_1.position.copyFrom(_this.sceneManager.camera.position);
663
+ if (lightTarget_1) {
664
+ lightTarget_1.subtractToRef(flashlight_1.position, flashlight_1.direction);
665
+ }
666
+ }
667
+ };
668
+ this.sceneManager.scene.registerBeforeRender(updateFlashlightFunction);
669
+ this._registeredOnBeforeRenderFunctions.push(updateFlashlightFunction);
670
+ }
671
+ };
672
+ return DefaultViewer;
673
+ }(AbstractViewerWithTemplate));
674
+ export { DefaultViewer };
675
+ //# sourceMappingURL=defaultViewer.js.map