@onerjs/core 8.56.1 → 8.56.3

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 (90) hide show
  1. package/Cameras/arcRotateCamera.pure.js +24 -0
  2. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  3. package/Cameras/camera.pure.js +7 -7
  4. package/Cameras/camera.pure.js.map +1 -1
  5. package/Engines/abstractEngine.pure.js +2 -2
  6. package/Engines/abstractEngine.pure.js.map +1 -1
  7. package/Engines/constants.d.ts +5 -0
  8. package/Engines/constants.js +5 -0
  9. package/Engines/constants.js.map +1 -1
  10. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +4 -0
  11. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +12 -0
  12. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  13. package/FrameGraph/Node/Blocks/inputBlock.pure.js +2 -1
  14. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  15. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +2 -0
  16. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +2 -0
  17. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  18. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +21 -0
  19. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +45 -0
  20. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  21. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.d.ts +1 -0
  22. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +18 -3
  23. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  24. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +5 -21
  25. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  26. package/Materials/Node/nodeMaterial.pure.d.ts +10 -0
  27. package/Materials/Node/nodeMaterial.pure.js +11 -0
  28. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  29. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -0
  30. package/Materials/Node/nodeMaterialBuildState.js +7 -1
  31. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  32. package/Materials/PBR/openpbrMaterial.pure.d.ts +3 -0
  33. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +3 -0
  34. package/Materials/Textures/textureProcessor.d.ts +29 -6
  35. package/Materials/Textures/textureProcessor.js +22 -16
  36. package/Materials/Textures/textureProcessor.js.map +1 -1
  37. package/Materials/materialHelper.geometryrendering.d.ts +19 -0
  38. package/Materials/materialHelper.geometryrendering.js +29 -1
  39. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  40. package/Materials/prepass.defines.d.ts +3 -0
  41. package/Materials/prepass.defines.js +3 -0
  42. package/Materials/prepass.defines.js.map +1 -1
  43. package/Materials/standardMaterial.pure.d.ts +3 -0
  44. package/Maths/math.vector.pure.d.ts +1 -5
  45. package/Maths/math.vector.pure.js.map +1 -1
  46. package/Misc/filesInput.d.ts +15 -0
  47. package/Misc/filesInput.js +156 -74
  48. package/Misc/filesInput.js.map +1 -1
  49. package/Misc/tools.pure.js +1 -1
  50. package/Misc/tools.pure.js.map +1 -1
  51. package/Rendering/geometryBufferRenderer.pure.d.ts +30 -0
  52. package/Rendering/geometryBufferRenderer.pure.js +84 -0
  53. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  54. package/Shaders/ShadersInclude/objectIdFunctions.d.ts +5 -0
  55. package/Shaders/ShadersInclude/objectIdFunctions.js +22 -0
  56. package/Shaders/ShadersInclude/objectIdFunctions.js.map +1 -0
  57. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +3 -0
  58. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  59. package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -0
  60. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  61. package/Shaders/ShadersInclude/prePassDeclaration.d.ts +1 -0
  62. package/Shaders/ShadersInclude/prePassDeclaration.js +5 -0
  63. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  64. package/Shaders/default.fragment.js +5 -1
  65. package/Shaders/default.fragment.js.map +1 -1
  66. package/Shaders/geometry.fragment.js +9 -1
  67. package/Shaders/geometry.fragment.js.map +1 -1
  68. package/Shaders/openpbr.fragment.js +2 -1
  69. package/Shaders/openpbr.fragment.js.map +1 -1
  70. package/Shaders/pbr.fragment.js +2 -1
  71. package/Shaders/pbr.fragment.js.map +1 -1
  72. package/ShadersWGSL/ShadersInclude/objectIdFunctions.d.ts +5 -0
  73. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js +22 -0
  74. package/ShadersWGSL/ShadersInclude/objectIdFunctions.js.map +1 -0
  75. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +3 -0
  76. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  77. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -0
  78. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  79. package/ShadersWGSL/ShadersInclude/prePassDeclaration.d.ts +1 -0
  80. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +5 -0
  81. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  82. package/ShadersWGSL/default.fragment.js +5 -1
  83. package/ShadersWGSL/default.fragment.js.map +1 -1
  84. package/ShadersWGSL/geometry.fragment.js +9 -1
  85. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  86. package/ShadersWGSL/openpbr.fragment.js +2 -1
  87. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  88. package/ShadersWGSL/pbr.fragment.js +2 -1
  89. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  90. package/package.json +1 -1
@@ -19,6 +19,10 @@ export declare class FilesInput {
19
19
  * @returns false to abort the process
20
20
  */
21
21
  onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean;
22
+ /**
23
+ * Callback called when an accepted file selection does not contain a loadable scene.
24
+ */
25
+ onProcessFilesErrorCallback: (files: File[]) => void;
22
26
  /**
23
27
  * If a loading UI should be displayed while loading a file
24
28
  */
@@ -42,6 +46,10 @@ export declare class FilesInput {
42
46
  private _elementToMonitor;
43
47
  private _sceneFileToLoad;
44
48
  private _filesToLoad;
49
+ private _fileSelectionGeneration;
50
+ private _reloadGeneration;
51
+ private _isLoading;
52
+ private readonly _renderLoop;
45
53
  /**
46
54
  * Creates a new FilesInput
47
55
  * @param engine defines the rendering engine
@@ -67,11 +75,17 @@ export declare class FilesInput {
67
75
  monitorElementForDragNDrop(elementToMonitor: HTMLElement): void;
68
76
  /** Gets the current list of files to load */
69
77
  get filesToLoad(): File[];
78
+ /**
79
+ * Clears the files and scene selection associated with the current load.
80
+ * @param cancelActiveLoad whether an in-progress replacement load should be canceled, restoring FilesInput-managed loading UI and rendering
81
+ */
82
+ clearFileSelection(cancelActiveLoad?: boolean): void;
70
83
  /**
71
84
  * Release all associated resources
72
85
  */
73
86
  dispose(): void;
74
87
  private _renderFunction;
88
+ private _restoreCurrentScene;
75
89
  private _drag;
76
90
  private _drop;
77
91
  private _traverseFolder;
@@ -81,6 +95,7 @@ export declare class FilesInput {
81
95
  * @param event defines the drop event to use as source
82
96
  */
83
97
  loadFiles(event: any): void;
98
+ private _processLoadedFiles;
84
99
  private _processReload;
85
100
  /**
86
101
  * Reload the current scene from the loaded files
@@ -36,6 +36,10 @@ export class FilesInput {
36
36
  this.onProcessFileCallback = () => {
37
37
  return true;
38
38
  };
39
+ /**
40
+ * Callback called when an accepted file selection does not contain a loadable scene.
41
+ */
42
+ this.onProcessFilesErrorCallback = () => { };
39
43
  /**
40
44
  * If a loading UI should be displayed while loading a file
41
45
  */
@@ -49,6 +53,14 @@ export class FilesInput {
49
53
  this.loadAsync = async (sceneFile, onProgress) => this.useAppend
50
54
  ? await SceneLoader.AppendAsync("file:", sceneFile, this._currentScene, onProgress)
51
55
  : await SceneLoader.LoadAsync("file:", sceneFile, this._engine, onProgress);
56
+ this._sceneFileToLoad = null;
57
+ this._filesToLoad = [];
58
+ this._fileSelectionGeneration = 0;
59
+ this._reloadGeneration = 0;
60
+ this._isLoading = false;
61
+ this._renderLoop = () => {
62
+ this._renderFunction();
63
+ };
52
64
  this._engine = engine;
53
65
  this._currentScene = scene;
54
66
  this._sceneLoadedCallback = sceneLoadedCallback;
@@ -86,6 +98,21 @@ export class FilesInput {
86
98
  get filesToLoad() {
87
99
  return this._filesToLoad;
88
100
  }
101
+ /**
102
+ * Clears the files and scene selection associated with the current load.
103
+ * @param cancelActiveLoad whether an in-progress replacement load should be canceled, restoring FilesInput-managed loading UI and rendering
104
+ */
105
+ clearFileSelection(cancelActiveLoad = true) {
106
+ this._fileSelectionGeneration++;
107
+ if (cancelActiveLoad) {
108
+ this._reloadGeneration++;
109
+ }
110
+ this._sceneFileToLoad = null;
111
+ this._filesToLoad = [];
112
+ if (cancelActiveLoad && this._isLoading) {
113
+ this._restoreCurrentScene();
114
+ }
115
+ }
89
116
  /**
90
117
  * Release all associated resources
91
118
  */
@@ -111,6 +138,15 @@ export class FilesInput {
111
138
  this._currentScene.render();
112
139
  }
113
140
  }
141
+ _restoreCurrentScene() {
142
+ this._isLoading = false;
143
+ if (this.displayLoadingUI) {
144
+ this._engine.hideLoadingUI();
145
+ }
146
+ if (!this.useAppend && !this.dontInjectRenderLoop && this._currentScene) {
147
+ this._engine.runRenderLoop(this._renderLoop);
148
+ }
149
+ }
114
150
  _drag(e) {
115
151
  e.stopPropagation();
116
152
  e.preventDefault();
@@ -123,30 +159,48 @@ export class FilesInput {
123
159
  _traverseFolder(folder, files, remaining, callback) {
124
160
  const reader = folder.createReader();
125
161
  const relativePath = folder.fullPath.replace(/^\//, "").replace(/(.+?)\/?$/, "$1/");
126
- reader.readEntries((entries) => {
127
- remaining.count += entries.length;
128
- for (const entry of entries) {
129
- if (entry.isFile) {
130
- entry.file((file) => {
131
- file.correctName = relativePath + file.name;
132
- files.push(file);
133
- if (--remaining.count === 0) {
134
- callback();
135
- }
136
- });
137
- }
138
- else if (entry.isDirectory) {
139
- this._traverseFolder(entry, files, remaining, callback);
140
- }
141
- }
162
+ const completeEntry = () => {
142
163
  if (--remaining.count === 0) {
143
164
  callback();
144
165
  }
145
- });
166
+ };
167
+ const readNextBatch = () => {
168
+ reader.readEntries((entries) => {
169
+ if (entries.length === 0) {
170
+ completeEntry();
171
+ return;
172
+ }
173
+ remaining.count += entries.length;
174
+ for (const entry of entries) {
175
+ if (entry.isFile) {
176
+ entry.file((file) => {
177
+ file.correctName = relativePath + file.name;
178
+ files.push(file);
179
+ completeEntry();
180
+ }, (error) => {
181
+ Logger.Error(`Unable to read dropped file '${entry.fullPath}': ${error.message}`);
182
+ completeEntry();
183
+ });
184
+ }
185
+ else if (entry.isDirectory) {
186
+ this._traverseFolder(entry, files, remaining, callback);
187
+ }
188
+ else {
189
+ completeEntry();
190
+ }
191
+ }
192
+ // DirectoryReader may return large folders in several batches.
193
+ readNextBatch();
194
+ }, (error) => {
195
+ Logger.Error(`Unable to read dropped folder '${folder.fullPath}': ${error.message}`);
196
+ completeEntry();
197
+ });
198
+ };
199
+ readNextBatch();
146
200
  }
147
201
  _processFiles(files) {
148
202
  for (let i = 0; i < files.length; i++) {
149
- const name = files[i].correctName.toLowerCase();
203
+ const name = (files[i].correctName || files[i].webkitRelativePath || files[i].name).replace(/\\/g, "/").replace(/^\/+/, "").toLowerCase();
150
204
  const extension = name.split(".").pop();
151
205
  if (!this.onProcessFileCallback(files[i], name, extension, (sceneFile) => (this._sceneFileToLoad = sceneFile))) {
152
206
  continue;
@@ -162,69 +216,91 @@ export class FilesInput {
162
216
  * @param event defines the drop event to use as source
163
217
  */
164
218
  loadFiles(event) {
219
+ const dataTransferItems = event?.dataTransfer?.items;
220
+ let filesToLoad = [];
165
221
  // Handling data transfer via drag'n'drop
166
222
  if (event && event.dataTransfer && event.dataTransfer.files) {
167
- this._filesToLoad = event.dataTransfer.files;
223
+ filesToLoad = Array.from(event.dataTransfer.files);
168
224
  }
169
225
  // Handling files from input files
170
226
  if (event && event.target && event.target.files) {
171
- this._filesToLoad = event.target.files;
227
+ filesToLoad = Array.from(event.target.files);
172
228
  }
173
- if (!this._filesToLoad || this._filesToLoad.length === 0) {
229
+ if (filesToLoad.length === 0 && (!dataTransferItems || dataTransferItems.length === 0)) {
174
230
  return;
175
231
  }
176
- if (this._startingProcessingFilesCallback) {
177
- this._startingProcessingFilesCallback(this._filesToLoad);
178
- }
179
- if (this._filesToLoad && this._filesToLoad.length > 0) {
180
- const files = [];
181
- const folders = [];
182
- const items = event.dataTransfer ? event.dataTransfer.items : null;
183
- for (let i = 0; i < this._filesToLoad.length; i++) {
184
- const fileToLoad = this._filesToLoad[i];
185
- const name = fileToLoad.name.toLowerCase();
186
- let entry;
187
- fileToLoad.correctName = name;
188
- if (items) {
189
- const item = items[i];
190
- if (item.getAsEntry) {
191
- entry = item.getAsEntry();
192
- }
193
- else if (item.webkitGetAsEntry) {
194
- entry = item.webkitGetAsEntry();
195
- }
232
+ const files = [];
233
+ const folders = [];
234
+ if (dataTransferItems?.length) {
235
+ for (let index = 0; index < dataTransferItems.length; index++) {
236
+ const item = dataTransferItems[index];
237
+ if (item.kind && item.kind !== "file") {
238
+ continue;
196
239
  }
197
- if (!entry) {
198
- files.push(fileToLoad);
240
+ const entry = item.getAsEntry?.() ?? item.webkitGetAsEntry?.();
241
+ if (entry?.isDirectory) {
242
+ folders.push(entry);
243
+ continue;
199
244
  }
200
- else {
201
- if (entry.isDirectory) {
202
- folders.push(entry);
203
- }
204
- else {
205
- files.push(fileToLoad);
206
- }
245
+ const file = item.getAsFile?.();
246
+ if (file) {
247
+ const fileWithPath = file;
248
+ fileWithPath.correctName = (entry?.fullPath || file.webkitRelativePath || file.name).replace(/\\/g, "/").replace(/^\/+/, "");
249
+ files.push(file);
207
250
  }
208
251
  }
209
- if (folders.length === 0) {
210
- this._processFiles(files);
211
- this._processReload();
252
+ }
253
+ if (files.length === 0 && folders.length === 0) {
254
+ for (let i = 0; i < filesToLoad.length; i++) {
255
+ const fileToLoad = filesToLoad[i];
256
+ const relativePath = fileToLoad.correctName || fileToLoad.webkitRelativePath || fileToLoad.name;
257
+ fileToLoad.correctName = relativePath.replace(/\\/g, "/").replace(/^\/+/, "");
258
+ files.push(fileToLoad);
212
259
  }
213
- else {
214
- const remaining = { count: folders.length };
215
- for (const folder of folders) {
216
- this._traverseFolder(folder, files, remaining, () => {
217
- this._processFiles(files);
218
- if (remaining.count === 0) {
219
- this._processReload();
220
- }
221
- });
222
- }
260
+ }
261
+ if (files.length === 0 && folders.length === 0) {
262
+ return;
263
+ }
264
+ const fileSelectionGeneration = ++this._fileSelectionGeneration;
265
+ if (!this.useAppend) {
266
+ this._reloadGeneration++;
267
+ }
268
+ this._sceneFileToLoad = null;
269
+ if (folders.length === 0) {
270
+ this._processLoadedFiles(files, fileSelectionGeneration);
271
+ }
272
+ else {
273
+ const remaining = { count: folders.length };
274
+ for (const folder of folders) {
275
+ this._traverseFolder(folder, files, remaining, () => {
276
+ if (remaining.count === 0) {
277
+ this._processLoadedFiles(files, fileSelectionGeneration);
278
+ }
279
+ });
223
280
  }
224
281
  }
225
282
  }
283
+ _processLoadedFiles(files, fileSelectionGeneration) {
284
+ if (fileSelectionGeneration !== this._fileSelectionGeneration) {
285
+ return;
286
+ }
287
+ if (files.length === 0) {
288
+ this._restoreCurrentScene();
289
+ this.onProcessFilesErrorCallback(files);
290
+ return;
291
+ }
292
+ this._sceneFileToLoad = null;
293
+ this._filesToLoad = files;
294
+ this._startingProcessingFilesCallback?.(files);
295
+ this._processFiles(files);
296
+ if (!this._sceneFileToLoad) {
297
+ this._restoreCurrentScene();
298
+ this.onProcessFilesErrorCallback(files);
299
+ }
300
+ this._processReload();
301
+ }
226
302
  _processReload() {
227
- if (this._onReloadCallback) {
303
+ if (this._onReloadCallback && this._sceneFileToLoad) {
228
304
  this._onReloadCallback(this._sceneFileToLoad);
229
305
  }
230
306
  else {
@@ -237,7 +313,10 @@ export class FilesInput {
237
313
  reload() {
238
314
  // If a scene file has been provided
239
315
  if (this._sceneFileToLoad) {
316
+ const sceneFileToLoad = this._sceneFileToLoad;
317
+ const reloadGeneration = ++this._reloadGeneration;
240
318
  if (!this.useAppend) {
319
+ this._isLoading = true;
241
320
  if (this._currentScene) {
242
321
  if (Logger.errorsCount > 0) {
243
322
  Logger.ClearLogCache();
@@ -249,9 +328,13 @@ export class FilesInput {
249
328
  if (this.displayLoadingUI) {
250
329
  this._engine.displayLoadingUI();
251
330
  }
252
- this.loadAsync(this._sceneFileToLoad, this._progressCallback)
331
+ this.loadAsync(sceneFileToLoad, this._progressCallback)
253
332
  // eslint-disable-next-line github/no-then
254
333
  .then((scene) => {
334
+ if (!this.useAppend && reloadGeneration !== this._reloadGeneration) {
335
+ scene.dispose();
336
+ return;
337
+ }
255
338
  // if appending do nothing
256
339
  if (!this.useAppend) {
257
340
  if (this._currentScene) {
@@ -260,13 +343,8 @@ export class FilesInput {
260
343
  this._currentScene = scene;
261
344
  // Wait for textures and shaders to be ready
262
345
  this._currentScene.executeWhenReady(() => {
263
- if (this.displayLoadingUI) {
264
- this._engine.hideLoadingUI();
265
- }
266
- if (!this.dontInjectRenderLoop) {
267
- this._engine.runRenderLoop(() => {
268
- this._renderFunction();
269
- });
346
+ if (reloadGeneration === this._reloadGeneration) {
347
+ this._restoreCurrentScene();
270
348
  }
271
349
  });
272
350
  }
@@ -276,16 +354,20 @@ export class FilesInput {
276
354
  }
277
355
  }
278
356
  if (this._sceneLoadedCallback && this._currentScene) {
279
- this._sceneLoadedCallback(this._sceneFileToLoad, this._currentScene);
357
+ this._sceneLoadedCallback(sceneFileToLoad, this._currentScene);
280
358
  }
281
359
  })
282
360
  // eslint-disable-next-line github/no-then
283
361
  .catch((error) => {
362
+ if (!this.useAppend && reloadGeneration !== this._reloadGeneration) {
363
+ return;
364
+ }
365
+ this._isLoading = false;
284
366
  if (this.displayLoadingUI) {
285
367
  this._engine.hideLoadingUI();
286
368
  }
287
369
  if (this._errorCallback) {
288
- this._errorCallback(this._sceneFileToLoad, this._currentScene, error.message);
370
+ this._errorCallback(sceneFileToLoad, this._currentScene, error.message);
289
371
  }
290
372
  });
291
373
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesInput.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/filesInput.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type Scene } from \"../scene\";\r\nimport { type ISceneLoaderProgressEvent, SceneLoader } from \"../Loading/sceneLoader\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { type Nullable } from \"../types\";\r\nimport { SceneLoaderFlags } from \"core/Loading/sceneLoaderFlags\";\r\n\r\n/**\r\n * Class used to help managing file picking and drag-n-drop\r\n */\r\nexport class FilesInput {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static get FilesToLoad() {\r\n return FilesInputStore.FilesToLoad;\r\n }\r\n\r\n /**\r\n * Callback called when a file is processed\r\n * @returns false to abort the process\r\n */\r\n public onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean = () => {\r\n return true;\r\n };\r\n\r\n /**\r\n * If a loading UI should be displayed while loading a file\r\n */\r\n public displayLoadingUI: boolean = true;\r\n\r\n /**\r\n * Function used when loading the scene file\r\n * @param sceneFile defines the file to load\r\n * @param onProgress onProgress callback called while loading the file\r\n * @returns a promise completing when the load is complete\r\n */\r\n public loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise<Scene> = async (sceneFile, onProgress) =>\r\n this.useAppend\r\n ? await SceneLoader.AppendAsync(\"file:\", sceneFile, this._currentScene, onProgress)\r\n : await SceneLoader.LoadAsync(\"file:\", sceneFile, this._engine, onProgress);\r\n\r\n private _engine: AbstractEngine;\r\n private _currentScene: Nullable<Scene>;\r\n private _sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>;\r\n private _progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>;\r\n private _additionalRenderLoopLogicCallback: Nullable<() => void>;\r\n private _textureLoadingCallback: Nullable<(remaining: number) => void>;\r\n private _startingProcessingFilesCallback: Nullable<(files?: File[]) => void>;\r\n private _onReloadCallback: Nullable<(sceneFile: File) => void>;\r\n private _errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>;\r\n private _elementToMonitor: HTMLElement;\r\n\r\n private _sceneFileToLoad: File;\r\n private _filesToLoad: File[];\r\n\r\n /**\r\n * Creates a new FilesInput\r\n * @param engine defines the rendering engine\r\n * @param scene defines the hosting scene\r\n * @param sceneLoadedCallback callback called when scene (files provided) is loaded\r\n * @param progressCallback callback called to track progress\r\n * @param additionalRenderLoopLogicCallback callback called to add user logic to the rendering loop\r\n * @param textureLoadingCallback callback called when a texture is loading\r\n * @param startingProcessingFilesCallback callback called when the system is about to process all files\r\n * @param onReloadCallback callback called when a reload is requested\r\n * @param errorCallback callback call if an error occurs\r\n * @param useAppend defines if the file loaded must be appended (true) or have the scene replaced (false, default behavior)\r\n * @param dontInjectRenderLoop defines if the render loop mustn't be injected into engine (default is false). Used only if useAppend is false.\r\n */\r\n constructor(\r\n engine: AbstractEngine,\r\n scene: Nullable<Scene>,\r\n sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>,\r\n progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>,\r\n additionalRenderLoopLogicCallback: Nullable<() => void>,\r\n textureLoadingCallback: Nullable<(remaining: number) => void>,\r\n startingProcessingFilesCallback: Nullable<(files?: File[]) => void>,\r\n onReloadCallback: Nullable<(sceneFile: File) => void>,\r\n errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>,\r\n public readonly useAppend = false,\r\n public readonly dontInjectRenderLoop = false\r\n ) {\r\n this._engine = engine;\r\n this._currentScene = scene;\r\n\r\n this._sceneLoadedCallback = sceneLoadedCallback;\r\n this._progressCallback = progressCallback;\r\n this._additionalRenderLoopLogicCallback = additionalRenderLoopLogicCallback;\r\n this._textureLoadingCallback = textureLoadingCallback;\r\n this._startingProcessingFilesCallback = startingProcessingFilesCallback;\r\n this._onReloadCallback = onReloadCallback;\r\n this._errorCallback = errorCallback;\r\n }\r\n\r\n private _dragEnterHandler: (e: any) => void;\r\n private _dragOverHandler: (e: any) => void;\r\n private _dropHandler: (e: any) => void;\r\n\r\n /**\r\n * Calls this function to listen to drag'n'drop events on a specific DOM element\r\n * @param elementToMonitor defines the DOM element to track\r\n */\r\n // should probably be DragAndDrop\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public monitorElementForDragNDrop(elementToMonitor: HTMLElement): void {\r\n if (elementToMonitor) {\r\n this._elementToMonitor = elementToMonitor;\r\n\r\n this._dragEnterHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dragOverHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dropHandler = (e) => {\r\n this._drop(e);\r\n };\r\n\r\n this._elementToMonitor.addEventListener(\"dragenter\", this._dragEnterHandler, false);\r\n this._elementToMonitor.addEventListener(\"dragover\", this._dragOverHandler, false);\r\n this._elementToMonitor.addEventListener(\"drop\", this._dropHandler, false);\r\n }\r\n }\r\n\r\n /** Gets the current list of files to load */\r\n public get filesToLoad() {\r\n return this._filesToLoad;\r\n }\r\n\r\n /**\r\n * Release all associated resources\r\n */\r\n public dispose() {\r\n if (!this._elementToMonitor) {\r\n return;\r\n }\r\n\r\n this._elementToMonitor.removeEventListener(\"dragenter\", this._dragEnterHandler);\r\n this._elementToMonitor.removeEventListener(\"dragover\", this._dragOverHandler);\r\n this._elementToMonitor.removeEventListener(\"drop\", this._dropHandler);\r\n }\r\n\r\n private _renderFunction(): void {\r\n if (this._additionalRenderLoopLogicCallback) {\r\n this._additionalRenderLoopLogicCallback();\r\n }\r\n\r\n if (this._currentScene) {\r\n if (this._textureLoadingCallback) {\r\n const remaining = this._currentScene.getWaitingItemsCount();\r\n\r\n if (remaining > 0) {\r\n this._textureLoadingCallback(remaining);\r\n }\r\n }\r\n this._currentScene.render();\r\n }\r\n }\r\n\r\n private _drag(e: DragEvent): void {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n private _drop(eventDrop: DragEvent): void {\r\n eventDrop.stopPropagation();\r\n eventDrop.preventDefault();\r\n\r\n this.loadFiles(eventDrop);\r\n }\r\n\r\n private _traverseFolder(folder: any, files: Array<any>, remaining: { count: number }, callback: () => void) {\r\n const reader = folder.createReader();\r\n const relativePath = folder.fullPath.replace(/^\\//, \"\").replace(/(.+?)\\/?$/, \"$1/\");\r\n reader.readEntries((entries: any) => {\r\n remaining.count += entries.length;\r\n for (const entry of entries) {\r\n if (entry.isFile) {\r\n entry.file((file: any) => {\r\n file.correctName = relativePath + file.name;\r\n files.push(file);\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n } else if (entry.isDirectory) {\r\n this._traverseFolder(entry, files, remaining, callback);\r\n }\r\n }\r\n\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n private _processFiles(files: Array<any>): void {\r\n for (let i = 0; i < files.length; i++) {\r\n const name = files[i].correctName.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n\r\n if (!this.onProcessFileCallback(files[i], name, extension, (sceneFile) => (this._sceneFileToLoad = sceneFile))) {\r\n continue;\r\n }\r\n\r\n if (SceneLoader.IsPluginForExtensionAvailable(\".\" + extension)) {\r\n this._sceneFileToLoad = files[i];\r\n }\r\n\r\n FilesInput.FilesToLoad[name] = files[i];\r\n }\r\n }\r\n\r\n /**\r\n * Load files from a drop event\r\n * @param event defines the drop event to use as source\r\n */\r\n public loadFiles(event: any): void {\r\n // Handling data transfer via drag'n'drop\r\n if (event && event.dataTransfer && event.dataTransfer.files) {\r\n this._filesToLoad = event.dataTransfer.files;\r\n }\r\n\r\n // Handling files from input files\r\n if (event && event.target && event.target.files) {\r\n this._filesToLoad = event.target.files;\r\n }\r\n\r\n if (!this._filesToLoad || this._filesToLoad.length === 0) {\r\n return;\r\n }\r\n\r\n if (this._startingProcessingFilesCallback) {\r\n this._startingProcessingFilesCallback(this._filesToLoad);\r\n }\r\n\r\n if (this._filesToLoad && this._filesToLoad.length > 0) {\r\n const files: File[] = [];\r\n const folders = [];\r\n const items = event.dataTransfer ? event.dataTransfer.items : null;\r\n\r\n for (let i = 0; i < this._filesToLoad.length; i++) {\r\n const fileToLoad: any = this._filesToLoad[i];\r\n const name = fileToLoad.name.toLowerCase();\r\n let entry;\r\n\r\n fileToLoad.correctName = name;\r\n\r\n if (items) {\r\n const item = items[i];\r\n if (item.getAsEntry) {\r\n entry = item.getAsEntry();\r\n } else if (item.webkitGetAsEntry) {\r\n entry = item.webkitGetAsEntry();\r\n }\r\n }\r\n\r\n if (!entry) {\r\n files.push(fileToLoad);\r\n } else {\r\n if (entry.isDirectory) {\r\n folders.push(entry);\r\n } else {\r\n files.push(fileToLoad);\r\n }\r\n }\r\n }\r\n\r\n if (folders.length === 0) {\r\n this._processFiles(files);\r\n this._processReload();\r\n } else {\r\n const remaining = { count: folders.length };\r\n for (const folder of folders) {\r\n this._traverseFolder(folder, files, remaining, () => {\r\n this._processFiles(files);\r\n\r\n if (remaining.count === 0) {\r\n this._processReload();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _processReload() {\r\n if (this._onReloadCallback) {\r\n this._onReloadCallback(this._sceneFileToLoad);\r\n } else {\r\n this.reload();\r\n }\r\n }\r\n\r\n /**\r\n * Reload the current scene from the loaded files\r\n */\r\n public reload() {\r\n // If a scene file has been provided\r\n if (this._sceneFileToLoad) {\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n if (Logger.errorsCount > 0) {\r\n Logger.ClearLogCache();\r\n }\r\n this._engine.stopRenderLoop();\r\n }\r\n }\r\n\r\n SceneLoaderFlags.ShowLoadingScreen = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.displayLoadingUI();\r\n }\r\n\r\n this.loadAsync(this._sceneFileToLoad, this._progressCallback)\r\n // eslint-disable-next-line github/no-then\r\n .then((scene) => {\r\n // if appending do nothing\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n this._currentScene.dispose();\r\n }\r\n\r\n this._currentScene = scene;\r\n\r\n // Wait for textures and shaders to be ready\r\n this._currentScene.executeWhenReady(() => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (!this.dontInjectRenderLoop) {\r\n this._engine.runRenderLoop(() => {\r\n this._renderFunction();\r\n });\r\n }\r\n });\r\n } else {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n }\r\n if (this._sceneLoadedCallback && this._currentScene) {\r\n this._sceneLoadedCallback(this._sceneFileToLoad, this._currentScene);\r\n }\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((error) => {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (this._errorCallback) {\r\n this._errorCallback(this._sceneFileToLoad, this._currentScene, error.message);\r\n }\r\n });\r\n } else {\r\n if (this._filesToLoad.length === 1) {\r\n const name = this._filesToLoad[0].name.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n if (extension) {\r\n switch (extension.toLowerCase()) {\r\n case \"dds\":\r\n case \"env\":\r\n case \"hdr\": {\r\n return; // Ignore error in that case\r\n }\r\n }\r\n }\r\n }\r\n Logger.Error(\"Please provide a valid .babylon file.\");\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"filesInput.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/filesInput.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type Scene } from \"../scene\";\r\nimport { type ISceneLoaderProgressEvent, SceneLoader } from \"../Loading/sceneLoader\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { type Nullable } from \"../types\";\r\nimport { SceneLoaderFlags } from \"core/Loading/sceneLoaderFlags\";\r\n\r\n/**\r\n * Class used to help managing file picking and drag-n-drop\r\n */\r\nexport class FilesInput {\r\n /**\r\n * List of files ready to be loaded\r\n */\r\n public static get FilesToLoad() {\r\n return FilesInputStore.FilesToLoad;\r\n }\r\n\r\n /**\r\n * Callback called when a file is processed\r\n * @returns false to abort the process\r\n */\r\n public onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean = () => {\r\n return true;\r\n };\r\n\r\n /**\r\n * Callback called when an accepted file selection does not contain a loadable scene.\r\n */\r\n public onProcessFilesErrorCallback: (files: File[]) => void = () => {};\r\n\r\n /**\r\n * If a loading UI should be displayed while loading a file\r\n */\r\n public displayLoadingUI: boolean = true;\r\n\r\n /**\r\n * Function used when loading the scene file\r\n * @param sceneFile defines the file to load\r\n * @param onProgress onProgress callback called while loading the file\r\n * @returns a promise completing when the load is complete\r\n */\r\n public loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise<Scene> = async (sceneFile, onProgress) =>\r\n this.useAppend\r\n ? await SceneLoader.AppendAsync(\"file:\", sceneFile, this._currentScene, onProgress)\r\n : await SceneLoader.LoadAsync(\"file:\", sceneFile, this._engine, onProgress);\r\n\r\n private _engine: AbstractEngine;\r\n private _currentScene: Nullable<Scene>;\r\n private _sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>;\r\n private _progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>;\r\n private _additionalRenderLoopLogicCallback: Nullable<() => void>;\r\n private _textureLoadingCallback: Nullable<(remaining: number) => void>;\r\n private _startingProcessingFilesCallback: Nullable<(files?: File[]) => void>;\r\n private _onReloadCallback: Nullable<(sceneFile: File) => void>;\r\n private _errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>;\r\n private _elementToMonitor: HTMLElement;\r\n\r\n private _sceneFileToLoad: Nullable<File> = null;\r\n private _filesToLoad: File[] = [];\r\n private _fileSelectionGeneration = 0;\r\n private _reloadGeneration = 0;\r\n private _isLoading = false;\r\n private readonly _renderLoop = () => {\r\n this._renderFunction();\r\n };\r\n\r\n /**\r\n * Creates a new FilesInput\r\n * @param engine defines the rendering engine\r\n * @param scene defines the hosting scene\r\n * @param sceneLoadedCallback callback called when scene (files provided) is loaded\r\n * @param progressCallback callback called to track progress\r\n * @param additionalRenderLoopLogicCallback callback called to add user logic to the rendering loop\r\n * @param textureLoadingCallback callback called when a texture is loading\r\n * @param startingProcessingFilesCallback callback called when the system is about to process all files\r\n * @param onReloadCallback callback called when a reload is requested\r\n * @param errorCallback callback call if an error occurs\r\n * @param useAppend defines if the file loaded must be appended (true) or have the scene replaced (false, default behavior)\r\n * @param dontInjectRenderLoop defines if the render loop mustn't be injected into engine (default is false). Used only if useAppend is false.\r\n */\r\n constructor(\r\n engine: AbstractEngine,\r\n scene: Nullable<Scene>,\r\n sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>,\r\n progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>,\r\n additionalRenderLoopLogicCallback: Nullable<() => void>,\r\n textureLoadingCallback: Nullable<(remaining: number) => void>,\r\n startingProcessingFilesCallback: Nullable<(files?: File[]) => void>,\r\n onReloadCallback: Nullable<(sceneFile: File) => void>,\r\n errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>,\r\n public readonly useAppend = false,\r\n public readonly dontInjectRenderLoop = false\r\n ) {\r\n this._engine = engine;\r\n this._currentScene = scene;\r\n\r\n this._sceneLoadedCallback = sceneLoadedCallback;\r\n this._progressCallback = progressCallback;\r\n this._additionalRenderLoopLogicCallback = additionalRenderLoopLogicCallback;\r\n this._textureLoadingCallback = textureLoadingCallback;\r\n this._startingProcessingFilesCallback = startingProcessingFilesCallback;\r\n this._onReloadCallback = onReloadCallback;\r\n this._errorCallback = errorCallback;\r\n }\r\n\r\n private _dragEnterHandler: (e: any) => void;\r\n private _dragOverHandler: (e: any) => void;\r\n private _dropHandler: (e: any) => void;\r\n\r\n /**\r\n * Calls this function to listen to drag'n'drop events on a specific DOM element\r\n * @param elementToMonitor defines the DOM element to track\r\n */\r\n // should probably be DragAndDrop\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public monitorElementForDragNDrop(elementToMonitor: HTMLElement): void {\r\n if (elementToMonitor) {\r\n this._elementToMonitor = elementToMonitor;\r\n\r\n this._dragEnterHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dragOverHandler = (e) => {\r\n this._drag(e);\r\n };\r\n this._dropHandler = (e) => {\r\n this._drop(e);\r\n };\r\n\r\n this._elementToMonitor.addEventListener(\"dragenter\", this._dragEnterHandler, false);\r\n this._elementToMonitor.addEventListener(\"dragover\", this._dragOverHandler, false);\r\n this._elementToMonitor.addEventListener(\"drop\", this._dropHandler, false);\r\n }\r\n }\r\n\r\n /** Gets the current list of files to load */\r\n public get filesToLoad() {\r\n return this._filesToLoad;\r\n }\r\n\r\n /**\r\n * Clears the files and scene selection associated with the current load.\r\n * @param cancelActiveLoad whether an in-progress replacement load should be canceled, restoring FilesInput-managed loading UI and rendering\r\n */\r\n public clearFileSelection(cancelActiveLoad = true): void {\r\n this._fileSelectionGeneration++;\r\n if (cancelActiveLoad) {\r\n this._reloadGeneration++;\r\n }\r\n this._sceneFileToLoad = null;\r\n this._filesToLoad = [];\r\n if (cancelActiveLoad && this._isLoading) {\r\n this._restoreCurrentScene();\r\n }\r\n }\r\n\r\n /**\r\n * Release all associated resources\r\n */\r\n public dispose() {\r\n if (!this._elementToMonitor) {\r\n return;\r\n }\r\n\r\n this._elementToMonitor.removeEventListener(\"dragenter\", this._dragEnterHandler);\r\n this._elementToMonitor.removeEventListener(\"dragover\", this._dragOverHandler);\r\n this._elementToMonitor.removeEventListener(\"drop\", this._dropHandler);\r\n }\r\n\r\n private _renderFunction(): void {\r\n if (this._additionalRenderLoopLogicCallback) {\r\n this._additionalRenderLoopLogicCallback();\r\n }\r\n\r\n if (this._currentScene) {\r\n if (this._textureLoadingCallback) {\r\n const remaining = this._currentScene.getWaitingItemsCount();\r\n\r\n if (remaining > 0) {\r\n this._textureLoadingCallback(remaining);\r\n }\r\n }\r\n this._currentScene.render();\r\n }\r\n }\r\n\r\n private _restoreCurrentScene(): void {\r\n this._isLoading = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (!this.useAppend && !this.dontInjectRenderLoop && this._currentScene) {\r\n this._engine.runRenderLoop(this._renderLoop);\r\n }\r\n }\r\n\r\n private _drag(e: DragEvent): void {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n private _drop(eventDrop: DragEvent): void {\r\n eventDrop.stopPropagation();\r\n eventDrop.preventDefault();\r\n\r\n this.loadFiles(eventDrop);\r\n }\r\n\r\n private _traverseFolder(folder: any, files: Array<any>, remaining: { count: number }, callback: () => void) {\r\n const reader = folder.createReader();\r\n const relativePath = folder.fullPath.replace(/^\\//, \"\").replace(/(.+?)\\/?$/, \"$1/\");\r\n\r\n const completeEntry = () => {\r\n if (--remaining.count === 0) {\r\n callback();\r\n }\r\n };\r\n const readNextBatch = () => {\r\n reader.readEntries(\r\n (entries: any[]) => {\r\n if (entries.length === 0) {\r\n completeEntry();\r\n return;\r\n }\r\n\r\n remaining.count += entries.length;\r\n for (const entry of entries) {\r\n if (entry.isFile) {\r\n entry.file(\r\n (file: any) => {\r\n file.correctName = relativePath + file.name;\r\n files.push(file);\r\n completeEntry();\r\n },\r\n (error: DOMException) => {\r\n Logger.Error(`Unable to read dropped file '${entry.fullPath}': ${error.message}`);\r\n completeEntry();\r\n }\r\n );\r\n } else if (entry.isDirectory) {\r\n this._traverseFolder(entry, files, remaining, callback);\r\n } else {\r\n completeEntry();\r\n }\r\n }\r\n\r\n // DirectoryReader may return large folders in several batches.\r\n readNextBatch();\r\n },\r\n (error: DOMException) => {\r\n Logger.Error(`Unable to read dropped folder '${folder.fullPath}': ${error.message}`);\r\n completeEntry();\r\n }\r\n );\r\n };\r\n\r\n readNextBatch();\r\n }\r\n\r\n private _processFiles(files: Array<any>): void {\r\n for (let i = 0; i < files.length; i++) {\r\n const name = (files[i].correctName || files[i].webkitRelativePath || files[i].name).replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n\r\n if (!this.onProcessFileCallback(files[i], name, extension, (sceneFile) => (this._sceneFileToLoad = sceneFile))) {\r\n continue;\r\n }\r\n\r\n if (SceneLoader.IsPluginForExtensionAvailable(\".\" + extension)) {\r\n this._sceneFileToLoad = files[i];\r\n }\r\n\r\n FilesInput.FilesToLoad[name] = files[i];\r\n }\r\n }\r\n\r\n /**\r\n * Load files from a drop event\r\n * @param event defines the drop event to use as source\r\n */\r\n public loadFiles(event: any): void {\r\n const dataTransferItems = event?.dataTransfer?.items;\r\n let filesToLoad: File[] = [];\r\n\r\n // Handling data transfer via drag'n'drop\r\n if (event && event.dataTransfer && event.dataTransfer.files) {\r\n filesToLoad = Array.from(event.dataTransfer.files);\r\n }\r\n\r\n // Handling files from input files\r\n if (event && event.target && event.target.files) {\r\n filesToLoad = Array.from(event.target.files);\r\n }\r\n\r\n if (filesToLoad.length === 0 && (!dataTransferItems || dataTransferItems.length === 0)) {\r\n return;\r\n }\r\n\r\n const files: File[] = [];\r\n const folders = [];\r\n if (dataTransferItems?.length) {\r\n for (let index = 0; index < dataTransferItems.length; index++) {\r\n const item = dataTransferItems[index];\r\n if (item.kind && item.kind !== \"file\") {\r\n continue;\r\n }\r\n const entry = item.getAsEntry?.() ?? item.webkitGetAsEntry?.();\r\n if (entry?.isDirectory) {\r\n folders.push(entry);\r\n continue;\r\n }\r\n const file = item.getAsFile?.();\r\n if (file) {\r\n const fileWithPath = file as File & { correctName?: string };\r\n fileWithPath.correctName = (entry?.fullPath || file.webkitRelativePath || file.name).replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\r\n files.push(file);\r\n }\r\n }\r\n }\r\n if (files.length === 0 && folders.length === 0) {\r\n for (let i = 0; i < filesToLoad.length; i++) {\r\n const fileToLoad = filesToLoad[i] as File & { correctName?: string };\r\n const relativePath = fileToLoad.correctName || fileToLoad.webkitRelativePath || fileToLoad.name;\r\n fileToLoad.correctName = relativePath.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\r\n files.push(fileToLoad);\r\n }\r\n }\r\n if (files.length === 0 && folders.length === 0) {\r\n return;\r\n }\r\n\r\n const fileSelectionGeneration = ++this._fileSelectionGeneration;\r\n if (!this.useAppend) {\r\n this._reloadGeneration++;\r\n }\r\n this._sceneFileToLoad = null;\r\n\r\n if (folders.length === 0) {\r\n this._processLoadedFiles(files, fileSelectionGeneration);\r\n } else {\r\n const remaining = { count: folders.length };\r\n for (const folder of folders) {\r\n this._traverseFolder(folder, files, remaining, () => {\r\n if (remaining.count === 0) {\r\n this._processLoadedFiles(files, fileSelectionGeneration);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n private _processLoadedFiles(files: File[], fileSelectionGeneration: number): void {\r\n if (fileSelectionGeneration !== this._fileSelectionGeneration) {\r\n return;\r\n }\r\n if (files.length === 0) {\r\n this._restoreCurrentScene();\r\n this.onProcessFilesErrorCallback(files);\r\n return;\r\n }\r\n this._sceneFileToLoad = null;\r\n this._filesToLoad = files;\r\n this._startingProcessingFilesCallback?.(files);\r\n this._processFiles(files);\r\n if (!this._sceneFileToLoad) {\r\n this._restoreCurrentScene();\r\n this.onProcessFilesErrorCallback(files);\r\n }\r\n this._processReload();\r\n }\r\n\r\n private _processReload() {\r\n if (this._onReloadCallback && this._sceneFileToLoad) {\r\n this._onReloadCallback(this._sceneFileToLoad);\r\n } else {\r\n this.reload();\r\n }\r\n }\r\n\r\n /**\r\n * Reload the current scene from the loaded files\r\n */\r\n public reload() {\r\n // If a scene file has been provided\r\n if (this._sceneFileToLoad) {\r\n const sceneFileToLoad = this._sceneFileToLoad;\r\n const reloadGeneration = ++this._reloadGeneration;\r\n if (!this.useAppend) {\r\n this._isLoading = true;\r\n if (this._currentScene) {\r\n if (Logger.errorsCount > 0) {\r\n Logger.ClearLogCache();\r\n }\r\n this._engine.stopRenderLoop();\r\n }\r\n }\r\n\r\n SceneLoaderFlags.ShowLoadingScreen = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.displayLoadingUI();\r\n }\r\n\r\n this.loadAsync(sceneFileToLoad, this._progressCallback)\r\n // eslint-disable-next-line github/no-then\r\n .then((scene) => {\r\n if (!this.useAppend && reloadGeneration !== this._reloadGeneration) {\r\n scene.dispose();\r\n return;\r\n }\r\n\r\n // if appending do nothing\r\n if (!this.useAppend) {\r\n if (this._currentScene) {\r\n this._currentScene.dispose();\r\n }\r\n\r\n this._currentScene = scene;\r\n\r\n // Wait for textures and shaders to be ready\r\n this._currentScene.executeWhenReady(() => {\r\n if (reloadGeneration === this._reloadGeneration) {\r\n this._restoreCurrentScene();\r\n }\r\n });\r\n } else {\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n }\r\n if (this._sceneLoadedCallback && this._currentScene) {\r\n this._sceneLoadedCallback(sceneFileToLoad, this._currentScene);\r\n }\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((error) => {\r\n if (!this.useAppend && reloadGeneration !== this._reloadGeneration) {\r\n return;\r\n }\r\n this._isLoading = false;\r\n if (this.displayLoadingUI) {\r\n this._engine.hideLoadingUI();\r\n }\r\n if (this._errorCallback) {\r\n this._errorCallback(sceneFileToLoad, this._currentScene, error.message);\r\n }\r\n });\r\n } else {\r\n if (this._filesToLoad.length === 1) {\r\n const name = this._filesToLoad[0].name.toLowerCase();\r\n const extension = name.split(\".\").pop();\r\n if (extension) {\r\n switch (extension.toLowerCase()) {\r\n case \"dds\":\r\n case \"env\":\r\n case \"hdr\": {\r\n return; // Ignore error in that case\r\n }\r\n }\r\n }\r\n }\r\n Logger.Error(\"Please provide a valid .babylon file.\");\r\n }\r\n }\r\n}\r\n"]}
@@ -1241,7 +1241,7 @@ Tools._DefaultCdnUrl = "https://cdn.babylonjs.com";
1241
1241
  * When set, unversioned CDN URLs will be rewritten to include this version prefix.
1242
1242
  * @internal
1243
1243
  */
1244
- Tools._CdnVersion = "9.25.0";
1244
+ Tools._CdnVersion = "9.26.0";
1245
1245
  /**
1246
1246
  * @internal
1247
1247
  */