浏览代码

Serialize Mesh accepts an array

Now a single mesh or an array of meshes can be serialized to be loaded
with ImportMesh
Raanan Weber 10 年之前
父节点
当前提交
98ae37350e
共有 2 个文件被更改,包括 95 次插入79 次删除
  1. 46 39
      src/Tools/babylon.sceneSerializer.js
  2. 49 40
      src/Tools/babylon.sceneSerializer.ts

+ 46 - 39
src/Tools/babylon.sceneSerializer.js

@@ -396,7 +396,7 @@ var BABYLON;
             serializationGeometries.torusKnots.push(serializeTorusKnot(geometry));
         }
         else if (geometry instanceof BABYLON.Geometry.Primitives._Primitive) {
-            throw new Error("Unknow primitive type");
+            throw new Error("Unknown primitive type");
         }
         else {
             serializationGeometries.vertexData.push(serializeVertexData(geometry));
@@ -599,6 +599,46 @@ var BABYLON;
         serializationObject.layerMask = mesh.layerMask;
         return serializationObject;
     };
+    var finalizeSingleMesh = function (mesh, serializationObject) {
+        //only works if the mesh is already loaded
+        if (mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_LOADED || mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_NONE) {
+            //serialize material
+            if (mesh.material) {
+                if (mesh.material instanceof BABYLON.StandardMaterial) {
+                    serializationObject.materials = serializationObject.materials || [];
+                    serializationObject.materials.push(serializeMaterial(mesh.material));
+                }
+                else if (mesh.material instanceof BABYLON.MultiMaterial) {
+                    serializationObject.multiMaterials = serializationObject.multiMaterials || [];
+                    serializationObject.multiMaterials.push(serializeMultiMaterial(mesh.material));
+                }
+            }
+            //serialize geometry
+            var geometry = mesh._geometry;
+            if (geometry) {
+                if (!serializationObject.geometries) {
+                    serializationObject.geometries = {};
+                    serializationObject.geometries.boxes = [];
+                    serializationObject.geometries.spheres = [];
+                    serializationObject.geometries.cylinders = [];
+                    serializationObject.geometries.toruses = [];
+                    serializationObject.geometries.grounds = [];
+                    serializationObject.geometries.planes = [];
+                    serializationObject.geometries.torusKnots = [];
+                    serializationObject.geometries.vertexData = [];
+                }
+                serializeGeometry(geometry, serializationObject.geometries);
+            }
+            // Skeletons
+            if (mesh.skeleton) {
+                serializationObject.skeletons = serializationObject.skeletons || [];
+                serializationObject.skeletons.push(serializeSkeleton(mesh.skeleton));
+            }
+            //serialize the actual mesh
+            serializationObject.meshes = serializationObject.meshes || [];
+            serializationObject.meshes.push(serializeMesh(mesh, serializationObject));
+        }
+    };
     var SceneSerializer = (function () {
         function SceneSerializer() {
         }
@@ -699,48 +739,15 @@ var BABYLON;
             }
             return serializationObject;
         };
-        SceneSerializer.SerializeMesh = function (mesh) {
+        SceneSerializer.SerializeMesh = function (toSerialize /* Mesh || Mesh[] */) {
             var serializationObject = {};
-            //only works if the mesh is already loaded
-            if (mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_LOADED || mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_NONE) {
-                //serialize material
-                if (mesh.material) {
-                    if (mesh.material instanceof BABYLON.StandardMaterial) {
-                        serializationObject.materials = [];
-                        serializationObject.materials.push(serializeMaterial(mesh.material));
-                    }
-                    else if (mesh.material instanceof BABYLON.MultiMaterial) {
-                        serializationObject.multiMaterials = [];
-                        serializationObject.multiMaterials.push(serializeMultiMaterial(mesh.material));
-                    }
-                }
-                //serialize geometry
-                var geometry = mesh._geometry;
-                if (geometry) {
-                    serializationObject.geometries = {};
-                    serializationObject.geometries.boxes = [];
-                    serializationObject.geometries.spheres = [];
-                    serializationObject.geometries.cylinders = [];
-                    serializationObject.geometries.toruses = [];
-                    serializationObject.geometries.grounds = [];
-                    serializationObject.geometries.planes = [];
-                    serializationObject.geometries.torusKnots = [];
-                    serializationObject.geometries.vertexData = [];
-                    serializeGeometry(geometry, serializationObject.geometries);
-                }
-                // Skeletons
-                if (mesh.skeleton) {
-                    serializationObject.skeletons = [];
-                    serializationObject.skeletons.push(serializeSkeleton(mesh.skeleton));
-                }
-                //serialize the actual mesh
-                serializationObject.meshes = [];
-                serializationObject.meshes.push(serializeMesh(mesh, serializationObject));
-            }
+            toSerialize = (toSerialize instanceof Array) ? toSerialize : [toSerialize];
+            toSerialize.forEach(function (mesh) {
+                finalizeSingleMesh(mesh, serializationObject);
+            });
             return serializationObject;
         };
         return SceneSerializer;
     })();
     BABYLON.SceneSerializer = SceneSerializer;
 })(BABYLON || (BABYLON = {}));
-//# sourceMappingURL=babylon.sceneSerializer.js.map

+ 49 - 40
src/Tools/babylon.sceneSerializer.ts

@@ -472,7 +472,7 @@
             serializationGeometries.torusKnots.push(serializeTorusKnot(<Geometry.Primitives.TorusKnot>geometry));
         }
         else if (geometry instanceof Geometry.Primitives._Primitive) {
-            throw new Error("Unknow primitive type");
+            throw new Error("Unknown primitive type");
         }
         else {
             serializationGeometries.vertexData.push(serializeVertexData(geometry));
@@ -741,6 +741,49 @@
         return serializationObject;
     };
 
+    var finalizeSingleMesh = function (mesh: Mesh, serializationObject : any) {
+        //only works if the mesh is already loaded
+        if (mesh.delayLoadState === Engine.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Engine.DELAYLOADSTATE_NONE) {
+            //serialize material
+            if (mesh.material) {
+                if (mesh.material instanceof StandardMaterial) {
+                    serializationObject.materials = serializationObject.materials || [];
+                    serializationObject.materials.push(serializeMaterial(<StandardMaterial>mesh.material));
+                } else if (mesh.material instanceof MultiMaterial) {
+                    serializationObject.multiMaterials = serializationObject.multiMaterials || [];
+                    serializationObject.multiMaterials.push(serializeMultiMaterial(<MultiMaterial>mesh.material));
+                }
+            }
+            //serialize geometry
+            var geometry = mesh._geometry;
+            if (geometry) {
+                if (!serializationObject.geometries) {
+                    serializationObject.geometries = {};
+
+                    serializationObject.geometries.boxes = [];
+                    serializationObject.geometries.spheres = [];
+                    serializationObject.geometries.cylinders = [];
+                    serializationObject.geometries.toruses = [];
+                    serializationObject.geometries.grounds = [];
+                    serializationObject.geometries.planes = [];
+                    serializationObject.geometries.torusKnots = [];
+                    serializationObject.geometries.vertexData = [];
+                }
+
+                serializeGeometry(geometry, serializationObject.geometries);
+            }
+            // Skeletons
+            if (mesh.skeleton) {
+                serializationObject.skeletons = serializationObject.skeletons || [];
+                serializationObject.skeletons.push(serializeSkeleton(mesh.skeleton));
+            }
+
+            //serialize the actual mesh
+            serializationObject.meshes = serializationObject.meshes || [];
+            serializationObject.meshes.push(serializeMesh(mesh, serializationObject));
+        }
+    }
+
 
     export class SceneSerializer {
         public static Serialize(scene: Scene): any {
@@ -860,47 +903,13 @@
             return serializationObject;
         }
 
-        public static SerializeMesh(mesh: Mesh): any {
+        public static SerializeMesh(toSerialize: any /* Mesh || Mesh[] */): any {
             var serializationObject: any = {};
 
-            //only works if the mesh is already loaded
-            if (mesh.delayLoadState === Engine.DELAYLOADSTATE_LOADED || mesh.delayLoadState === Engine.DELAYLOADSTATE_NONE) {
-                //serialize material
-                if (mesh.material) {
-                    if (mesh.material instanceof StandardMaterial) {
-                        serializationObject.materials = [];
-                        serializationObject.materials.push(serializeMaterial(<StandardMaterial>mesh.material));
-                    } else if (mesh.material instanceof MultiMaterial) {
-                        serializationObject.multiMaterials = [];
-                        serializationObject.multiMaterials.push(serializeMultiMaterial(<MultiMaterial>mesh.material));
-                    }
-                }
-                //serialize geometry
-                var geometry = mesh._geometry;
-                if (geometry) {
-                    serializationObject.geometries = {};
-
-                    serializationObject.geometries.boxes = [];
-                    serializationObject.geometries.spheres = [];
-                    serializationObject.geometries.cylinders = [];
-                    serializationObject.geometries.toruses = [];
-                    serializationObject.geometries.grounds = [];
-                    serializationObject.geometries.planes = [];
-                    serializationObject.geometries.torusKnots = [];
-                    serializationObject.geometries.vertexData = [];
-
-                    serializeGeometry(geometry, serializationObject.geometries);
-                }
-                // Skeletons
-                if (mesh.skeleton) {
-                    serializationObject.skeletons = [];
-                    serializationObject.skeletons.push(serializeSkeleton(mesh.skeleton));
-                }
-
-                //serialize the actual mesh
-                serializationObject.meshes = [];
-                serializationObject.meshes.push(serializeMesh(mesh, serializationObject));
-            }
+            toSerialize = (toSerialize instanceof Array) ? toSerialize : [toSerialize];
+            toSerialize.forEach(function (mesh: Mesh) {
+                finalizeSingleMesh(mesh, serializationObject);
+            });
 
             return serializationObject;
         }