|
@@ -75,7 +75,7 @@ var BABYLON = BABYLON || {};
|
|
|
return serializationObject;
|
|
|
};
|
|
|
|
|
|
- var appendAnimations = function(source, destination) {
|
|
|
+ var appendAnimations = function (source, destination) {
|
|
|
if (source.animations) {
|
|
|
destination.animations = [];
|
|
|
for (var animationIndex = 0; animationIndex < source.animations.length; animationIndex++) {
|
|
@@ -97,8 +97,8 @@ var BABYLON = BABYLON || {};
|
|
|
|
|
|
var dataType = animation.dataType;
|
|
|
serializationObject.keys = [];
|
|
|
- for (var index = 0; index < animation.keys.length; index++) {
|
|
|
- var animationKey = animation.keys[index];
|
|
|
+ for (var index = 0; index < animation._keys.length; index++) {
|
|
|
+ var animationKey = animation._keys[index];
|
|
|
|
|
|
var key = {};
|
|
|
key.frame = animationKey.frame;
|
|
@@ -120,6 +120,27 @@ var BABYLON = BABYLON || {};
|
|
|
return serializationObject;
|
|
|
};
|
|
|
|
|
|
+ var serializeMultiMaterial = function (material) {
|
|
|
+ var serializationObject = {};
|
|
|
+
|
|
|
+ serializationObject.name = material.name;
|
|
|
+ serializationObject.id = material.id;
|
|
|
+
|
|
|
+ serializationObject.materials = [];
|
|
|
+
|
|
|
+ for (var matIndex = 0; matIndex < material.subMaterials.length; matIndex++) {
|
|
|
+ var subMat = material.subMaterials[matIndex];
|
|
|
+
|
|
|
+ if (subMat) {
|
|
|
+ serializationObject.materials.push(subMat.id);
|
|
|
+ } else {
|
|
|
+ serializationObject.materials.push(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
+
|
|
|
var serializeMaterial = function (material) {
|
|
|
var serializationObject = {};
|
|
|
|
|
@@ -224,6 +245,214 @@ var BABYLON = BABYLON || {};
|
|
|
return serializationObject;
|
|
|
};
|
|
|
|
|
|
+ var serializeSkeleton = function (skeleton) {
|
|
|
+ var serializationObject = {};
|
|
|
+
|
|
|
+ serializationObject.name = skeleton.name;
|
|
|
+ serializationObject.id = skeleton.id;
|
|
|
+
|
|
|
+ serializationObject.bones = [];
|
|
|
+
|
|
|
+ for (var index = 0; index < skeleton.bones.length; index++) {
|
|
|
+ var bone = skeleton.bones[index];
|
|
|
+
|
|
|
+ var serializedBone = {
|
|
|
+ parentBoneIndex: bone._parent ? bone._parent.id : -1,
|
|
|
+ name: bone.name,
|
|
|
+ matrix: bone._matrix.toArray()
|
|
|
+ };
|
|
|
+
|
|
|
+ serializationObject.bones.push(serializedBone);
|
|
|
+
|
|
|
+ if (bone.animations && bone.animations.length > 0) {
|
|
|
+ serializedBone.animation = serializeAnimation(bone.animations[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
+
|
|
|
+ var serializeParticleSystem = function (particleSystem) {
|
|
|
+ var serializationObject = {};
|
|
|
+
|
|
|
+ serializationObject.emitterId = particleSystem.emitter.id;
|
|
|
+ serializationObject.capacity = particleSystem._capacity;
|
|
|
+
|
|
|
+ if (particleSystem.particleTexture) {
|
|
|
+ serializationObject.textureName = particleSystem.particleTexture.name;
|
|
|
+ }
|
|
|
+
|
|
|
+ serializationObject.minAngularSpeed = particleSystem.minAngularSpeed;
|
|
|
+ serializationObject.maxAngularSpeed = particleSystem.maxAngularSpeed;
|
|
|
+ serializationObject.minSize = particleSystem.minSize;
|
|
|
+ serializationObject.maxSize = particleSystem.maxSize;
|
|
|
+ serializationObject.minLifeTime = particleSystem.minLifeTime;
|
|
|
+ serializationObject.maxLifeTime = particleSystem.maxLifeTime;
|
|
|
+ serializationObject.emitRate = particleSystem.emitRate;
|
|
|
+ serializationObject.minEmitBox = particleSystem.minEmitBox.asArray();
|
|
|
+ serializationObject.maxEmitBox = particleSystem.maxEmitBox.asArray();
|
|
|
+ serializationObject.gravity = particleSystem.gravity.asArray();
|
|
|
+ serializationObject.direction1 = particleSystem.direction1.asArray();
|
|
|
+ serializationObject.direction2 = particleSystem.direction2.asArray();
|
|
|
+ serializationObject.color1 = particleSystem.color1.asArray();
|
|
|
+ serializationObject.color2 = particleSystem.color2.asArray();
|
|
|
+ serializationObject.colorDead = particleSystem.colorDead.asArray();
|
|
|
+ serializationObject.updateSpeed = particleSystem.updateSpeed;
|
|
|
+ serializationObject.targetStopDuration = particleSystem.targetStopFrame;
|
|
|
+ serializationObject.textureMask = particleSystem.textureMask.asArray();
|
|
|
+ serializationObject.blendMode = particleSystem.blendMode;
|
|
|
+
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
+
|
|
|
+ var serializeLensFlareSystem = function (lensFlareSystem) {
|
|
|
+ var serializationObject = {};
|
|
|
+
|
|
|
+ serializationObject.emitterId = lensFlareSystem._emitter.id;
|
|
|
+ serializationObject.borderLimit = lensFlareSystem.borderLimit;
|
|
|
+
|
|
|
+ serializationObject.flares = [];
|
|
|
+ for (var index = 0; index < lensFlareSystem.lensFlares.length; index++) {
|
|
|
+ var flare = lensFlareSystem.lensFlares[index];
|
|
|
+
|
|
|
+ serializationObject.flares.push({
|
|
|
+ size: flare.size,
|
|
|
+ position: flare.position,
|
|
|
+ color: flare.color.asArray(),
|
|
|
+ textureName: BABYLON.Tools.GetFilename(flare.texture.name)
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
+
|
|
|
+ var serializeShadowGenerator = function (light) {
|
|
|
+ var serializationObject = {};
|
|
|
+ var shadowGenerator = light._shadowGenerator;
|
|
|
+
|
|
|
+ serializationObject.lightId = light.id;
|
|
|
+ serializationObject.mapSize = shadowGenerator.getShadowMap()._size;
|
|
|
+ serializationObject.useVarianceShadowMap = shadowGenerator.useVarianceShadowMap;
|
|
|
+
|
|
|
+ serializationObject.renderList = [];
|
|
|
+ for (var meshIndex = 0; meshIndex < shadowGenerator.getShadowMap().renderList.length; meshIndex++) {
|
|
|
+ var mesh = shadowGenerator.getShadowMap().renderList[meshIndex];
|
|
|
+
|
|
|
+ serializationObject.renderList.push(mesh.id);
|
|
|
+ }
|
|
|
+
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
+
|
|
|
+ var serializeMesh = function (mesh) {
|
|
|
+ var serializationObject = {};
|
|
|
+
|
|
|
+ serializationObject.name = mesh.name;
|
|
|
+ serializationObject.id = mesh.id;
|
|
|
+
|
|
|
+ serializationObject.position = mesh.position.asArray();
|
|
|
+
|
|
|
+ if (mesh.rotation) {
|
|
|
+ serializationObject.rotation = mesh.rotation.asArray();
|
|
|
+ } else if (mesh.rotationQuaternion) {
|
|
|
+ serializationObject.rotationQuaternion = mesh.rotationQuaternion.asArray();
|
|
|
+ }
|
|
|
+
|
|
|
+ serializationObject.scaling = mesh.scaling.asArray();
|
|
|
+ serializationObject.localMatrix = mesh.getPivotMatrix().asArray();
|
|
|
+
|
|
|
+ serializationObject.isEnabled = mesh.isEnabled();
|
|
|
+ serializationObject.isVisible = mesh.isVisible;
|
|
|
+ serializationObject.infiniteDistance = mesh.infiniteDistance;
|
|
|
+
|
|
|
+ serializationObject.receiveShadows = mesh.receiveShadows;
|
|
|
+
|
|
|
+ serializationObject.billboardMode = mesh.billboardMode;
|
|
|
+ serializationObject.visibility = mesh.visibility;
|
|
|
+
|
|
|
+ serializationObject.checkCollisions = mesh.checkCollisions;
|
|
|
+
|
|
|
+ // Parent
|
|
|
+ if (mesh.parent) {
|
|
|
+ serializationObject.parentId = mesh.parent.id;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Geometry
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.PositionKind)) {
|
|
|
+ serializationObject.positions = mesh.getVerticesData(BABYLON.VertexBuffer.PositionKind);
|
|
|
+ serializationObject.normals = mesh.getVerticesData(BABYLON.VertexBuffer.NormalKind);
|
|
|
+
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UVKind)) {
|
|
|
+ serializationObject.uvs = mesh.getVerticesData(BABYLON.VertexBuffer.UVKind);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UV2Kind)) {
|
|
|
+ serializationObject.uvs2 = mesh.getVerticesData(BABYLON.VertexBuffer.UV2Kind);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.ColorKind)) {
|
|
|
+ serializationObject.colors = mesh.getVerticesData(BABYLON.VertexBuffer.ColorKind);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.MatricesWeightsKind)) {
|
|
|
+ serializationObject.matricesWeights = mesh.getVerticesData(BABYLON.VertexBuffer.MatricesWeightsKind);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mesh.isVerticesDataPresent(BABYLON.VertexBuffer.MatricesIndicesKind)) {
|
|
|
+ serializationObject.matricesWeights = mesh.getVerticesData(BABYLON.VertexBuffer.MatricesIndicesKind);
|
|
|
+ serializationObject.matricesWeights._isExpanded = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ serializationObject.indices = mesh.getIndices();
|
|
|
+
|
|
|
+ // SubMeshes
|
|
|
+ serializationObject.subMeshes = [];
|
|
|
+ for (var subIndex = 0; subIndex < mesh.subMeshes.length; subIndex++) {
|
|
|
+ var subMesh = mesh.subMeshes[subIndex];
|
|
|
+
|
|
|
+ serializationObject.subMeshes.push({
|
|
|
+ materialIndex: subMesh.materialIndex,
|
|
|
+ verticesStart: subMesh.verticesStart,
|
|
|
+ verticesCount: subMesh.verticesCount,
|
|
|
+ indexStart: subMesh.indexStart,
|
|
|
+ indexCount: subMesh.indexCount
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Material
|
|
|
+ if (mesh.material) {
|
|
|
+ serializationObject.materialId = mesh.material.id;
|
|
|
+ } else {
|
|
|
+ mesh.material = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Skeleton
|
|
|
+ if (mesh.skeleton) {
|
|
|
+ serializationObject.skeletonId = mesh.skeleton.id;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Physics
|
|
|
+ if (mesh.getPhysicsImpostor() !== BABYLON.PhysicsEngine.NoImpostor) {
|
|
|
+ serializationObject.physicsMass = mesh.getPhysicsMass();
|
|
|
+ serializationObject.physicsFriction = mesh.getPhysicsFriction();
|
|
|
+ serializationObject.physicsRestitution = mesh.getPhysicsRestitution();
|
|
|
+
|
|
|
+ switch (mesh.getPhysicsImpostor()) {
|
|
|
+ case BABYLON.PhysicsEngine.BoxImpostor:
|
|
|
+ serializationObject.physicsImpostor = 1;
|
|
|
+ break;
|
|
|
+ case BABYLON.PhysicsEngine.SphereImpostor:
|
|
|
+ serializationObject.physicsImpostor = 2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Animations
|
|
|
+ appendAnimations(mesh, serializationObject);
|
|
|
+
|
|
|
+ return serializationObject;
|
|
|
+ };
|
|
|
|
|
|
BABYLON.SceneSerializer = {
|
|
|
Serialize: function (scene) {
|
|
@@ -249,7 +478,7 @@ var BABYLON = BABYLON || {};
|
|
|
serializationObject.lights = [];
|
|
|
for (var index = 0; index < scene.lights.length; index++) {
|
|
|
var light = scene.lights[index];
|
|
|
-
|
|
|
+
|
|
|
serializationObject.lights.push(serializeLight(light));
|
|
|
}
|
|
|
|
|
@@ -258,7 +487,9 @@ var BABYLON = BABYLON || {};
|
|
|
for (var index = 0; index < scene.cameras.length; index++) {
|
|
|
var camera = scene.cameras[index];
|
|
|
|
|
|
- serializationObject.cameras.push(serializeCamera(camera));
|
|
|
+ if (camera instanceof BABYLON.FreeCamera) {
|
|
|
+ serializationObject.cameras.push(serializeCamera(camera));
|
|
|
+ }
|
|
|
}
|
|
|
if (scene.activecamera) {
|
|
|
serializationObject.activeCameraID = scene.activeCamera.id;
|
|
@@ -266,10 +497,53 @@ var BABYLON = BABYLON || {};
|
|
|
|
|
|
// Materials
|
|
|
serializationObject.materials = [];
|
|
|
+ serializationObject.multiMaterials = [];
|
|
|
for (var index = 0; index < scene.materials.length; index++) {
|
|
|
var material = scene.materials[index];
|
|
|
|
|
|
- serializationObject.materials.push(serializeMaterial(material));
|
|
|
+ if (material instanceof BABYLON.StandardMaterial) {
|
|
|
+ serializationObject.materials.push(serializeMaterial(material));
|
|
|
+ } else if (material instanceof BABYLON.MultiMaterial) {
|
|
|
+ serializationObject.multiMaterials.push(serializeMultiMaterial(material));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Skeletons
|
|
|
+ serializationObject.skeletons = [];
|
|
|
+ for (var index = 0; index < scene.skeletons.length; index++) {
|
|
|
+ serializationObject.skeletons.push(serializeSkeleton(scene.skeletons[index]));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Meshes
|
|
|
+ serializationObject.meshes = [];
|
|
|
+ for (var index = 0; index < scene.meshes.length; index++) {
|
|
|
+ var mesh = scene.meshes[index];
|
|
|
+
|
|
|
+ if (mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_LOADED || mesh.delayLoadState === BABYLON.Engine.DELAYLOADSTATE_NONE) {
|
|
|
+ serializationObject.meshes.push(serializeMesh(mesh));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Particles Systems
|
|
|
+ serializationObject.particleSystems = [];
|
|
|
+ for (var index = 0; index < scene.particleSystems.length; index++) {
|
|
|
+ serializationObject.particleSystems.push(serializeParticleSystem(scene.particleSystems[index]));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Lens flares
|
|
|
+ serializationObject.lensFlareSystems = [];
|
|
|
+ for (var index = 0; index < scene.lensFlareSystems.length; index++) {
|
|
|
+ serializationObject.lensFlareSystems.push(serializeLensFlareSystem(scene.lensFlareSystems[index]));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Shadows
|
|
|
+ serializationObject.shadowGenerators = [];
|
|
|
+ for (var index = 0; index < scene.lights.length; index++) {
|
|
|
+ var light = scene.lights[index];
|
|
|
+
|
|
|
+ if (light._shadowGenerator) {
|
|
|
+ serializationObject.shadowGenerators.push(serializeShadowGenerator(light));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return serializationObject;
|