Quellcode durchsuchen

Fix bug with serialization of base64 texture data

Popov72 vor 4 Jahren
Ursprung
Commit
4587de6cb6
3 geänderte Dateien mit 35 neuen und 7 gelöschten Zeilen
  1. 1 1
      src/Materials/Textures/texture.ts
  2. 3 3
      src/Misc/sceneRecorder.ts
  3. 31 3
      src/Misc/sceneSerializer.ts

+ 1 - 1
src/Materials/Textures/texture.ts

@@ -681,7 +681,7 @@ export class Texture extends BaseTexture {
             } else if (this.url && StringTools.StartsWith(this.url, "data:") && this._buffer instanceof Uint8Array) {
                 serializationObject.base64String = "data:image/png;base64," + StringTools.EncodeArrayBufferToBase64(this._buffer);
             } else if (Texture.ForceSerializeBuffers) {
-                serializationObject.base64String = CopyTools.GenerateBase64StringFromTexture(this); // TODO WEBGPU serialize should turn asynchronous as GenerateBase64StringFromTexture now returns a promise...
+                serializationObject.base64String = CopyTools.GenerateBase64StringFromTexture(this);
             }
         }
 

+ 3 - 3
src/Misc/sceneRecorder.ts

@@ -32,14 +32,14 @@ export class SceneRecorder {
 
     /**
      * Get the delta between current state and original state
-     * @returns a string containing the delta
+     * @returns a Promise<any> containing the delta
      */
-    public getDelta() {
+    public async getDelta(): Promise<any> {
         if (!this._trackedScene) {
             return null;
         }
 
-        let newJSON = SceneSerializer.Serialize(this._trackedScene);
+        let newJSON = await SceneSerializer.Serialize(this._trackedScene);
         let deltaJSON: any = {};
 
         for (var node in newJSON) {

+ 31 - 3
src/Misc/sceneSerializer.ts

@@ -111,9 +111,9 @@ export class SceneSerializer {
     /**
      * Serialize a scene into a JSON compatible object
      * @param scene defines the scene to serialize
-     * @returns a JSON compatible object
+     * @returns a JSON promise compatible object
      */
-    public static Serialize(scene: Scene): any {
+    public static Serialize(scene: Scene): Promise<any> {
         var serializationObject: any = {};
 
         SceneSerializer.ClearCache();
@@ -312,7 +312,35 @@ export class SceneSerializer {
             component.serialize(serializationObject);
         }
 
-        return serializationObject;
+        const promises: Array<Promise<any>> = [];
+
+        this._CollectPromises(serializationObject, promises);
+
+        return Promise.all(promises).then(() => serializationObject);
+    }
+
+    private static _CollectPromises(obj: any, promises: Array<Promise<any>>): void  {
+        if (Array.isArray(obj)) {
+            for (let i = 0; i < obj.length; ++i) {
+                const o = obj[i];
+                if (o instanceof Promise) {
+                    promises.push(o.then((res: any) => obj[i] = res));
+                } else if (o instanceof Object || Array.isArray(o)) {
+                    this._CollectPromises(o, promises);
+                }
+            }
+        } else if (obj instanceof Object) {
+            for (const name in obj) {
+                if (obj.hasOwnProperty(name)) {
+                    const o = obj[name];
+                    if (o instanceof Promise) {
+                        promises.push(o.then((res: any) => obj[name] = res));
+                    } else if (o instanceof Object || Array.isArray(o)) {
+                        this._CollectPromises(o, promises);
+                    }
+                }
+            }
+        }
     }
 
     /**