@onerjs/core 8.56.1 → 8.56.2
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.
- package/Cameras/arcRotateCamera.pure.js +24 -0
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +5 -0
- package/Engines/constants.js +5 -0
- package/Engines/constants.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +4 -0
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +12 -0
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js +2 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +2 -0
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +2 -0
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +21 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +45 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.d.ts +1 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +18 -3
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +5 -21
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +10 -0
- package/Materials/Node/nodeMaterial.pure.js +11 -0
- package/Materials/Node/nodeMaterial.pure.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +1 -0
- package/Materials/Node/nodeMaterialBuildState.js +7 -1
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.d.ts +3 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +3 -0
- package/Materials/Textures/textureProcessor.d.ts +29 -6
- package/Materials/Textures/textureProcessor.js +22 -16
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +19 -0
- package/Materials/materialHelper.geometryrendering.js +29 -1
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/prepass.defines.d.ts +3 -0
- package/Materials/prepass.defines.js +3 -0
- package/Materials/prepass.defines.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +3 -0
- package/Maths/math.vector.pure.d.ts +1 -5
- package/Maths/math.vector.pure.js.map +1 -1
- package/Misc/filesInput.d.ts +15 -0
- package/Misc/filesInput.js +156 -74
- package/Misc/filesInput.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.d.ts +30 -0
- package/Rendering/geometryBufferRenderer.pure.js +84 -0
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Shaders/ShadersInclude/objectIdFunctions.d.ts +5 -0
- package/Shaders/ShadersInclude/objectIdFunctions.js +22 -0
- package/Shaders/ShadersInclude/objectIdFunctions.js.map +1 -0
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js +3 -0
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -0
- package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/prePassDeclaration.js +5 -0
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/default.fragment.js +5 -1
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/geometry.fragment.js +9 -1
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/openpbr.fragment.js +2 -1
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +2 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.js +22 -0
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +3 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +5 -0
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +5 -1
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +9 -1
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.js +2 -1
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +2 -1
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/package.json +1 -1
package/Misc/filesInput.d.ts
CHANGED
|
@@ -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
|
package/Misc/filesInput.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
227
|
+
filesToLoad = Array.from(event.target.files);
|
|
172
228
|
}
|
|
173
|
-
if (
|
|
229
|
+
if (filesToLoad.length === 0 && (!dataTransferItems || dataTransferItems.length === 0)) {
|
|
174
230
|
return;
|
|
175
231
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
198
|
-
|
|
240
|
+
const entry = item.getAsEntry?.() ?? item.webkitGetAsEntry?.();
|
|
241
|
+
if (entry?.isDirectory) {
|
|
242
|
+
folders.push(entry);
|
|
243
|
+
continue;
|
|
199
244
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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(
|
|
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.
|
|
264
|
-
this.
|
|
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(
|
|
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(
|
|
370
|
+
this._errorCallback(sceneFileToLoad, this._currentScene, error.message);
|
|
289
371
|
}
|
|
290
372
|
});
|
|
291
373
|
}
|
package/Misc/filesInput.js.map
CHANGED
|
@@ -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"]}
|
package/Misc/tools.pure.js
CHANGED
|
@@ -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.
|
|
1244
|
+
Tools._CdnVersion = "9.26.0";
|
|
1245
1245
|
/**
|
|
1246
1246
|
* @internal
|
|
1247
1247
|
*/
|