فهرست منبع

Fixed serialization issue when dealing with complex hiearchies

David Catuhe 8 سال پیش
والد
کامیت
deefbcdbae
89فایلهای تغییر یافته به همراه26012 افزوده شده و 25621 حذف شده
  1. 6292 6284
      dist/preview release/babylon.d.ts
  2. 40 40
      dist/preview release/babylon.js
  3. 102 26
      dist/preview release/babylon.max.js
  4. 6292 6284
      dist/preview release/babylon.module.d.ts
  5. 40 40
      dist/preview release/babylon.worker.js
  6. 6435 6427
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts
  7. 27 27
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js
  8. 94 18
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js
  9. 6435 6427
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.module.d.ts
  10. 1 1
      dist/preview release/inspector/babylon.inspector.bundle.js
  11. 1 1
      dist/preview release/inspector/babylon.inspector.js
  12. 1 1
      dist/preview release/inspector/babylon.inspector.min.js
  13. 1 0
      dist/preview release/materialsLibrary/babylon.cellMaterial.d.ts
  14. 3 0
      dist/preview release/materialsLibrary/babylon.cellMaterial.js
  15. 1 1
      dist/preview release/materialsLibrary/babylon.cellMaterial.min.js
  16. 1 0
      dist/preview release/materialsLibrary/babylon.fireMaterial.d.ts
  17. 3 0
      dist/preview release/materialsLibrary/babylon.fireMaterial.js
  18. 1 1
      dist/preview release/materialsLibrary/babylon.fireMaterial.min.js
  19. 1 0
      dist/preview release/materialsLibrary/babylon.furMaterial.d.ts
  20. 3 0
      dist/preview release/materialsLibrary/babylon.furMaterial.js
  21. 1 1
      dist/preview release/materialsLibrary/babylon.furMaterial.min.js
  22. 1 0
      dist/preview release/materialsLibrary/babylon.gradientMaterial.d.ts
  23. 3 0
      dist/preview release/materialsLibrary/babylon.gradientMaterial.js
  24. 1 1
      dist/preview release/materialsLibrary/babylon.gradientMaterial.min.js
  25. 1 0
      dist/preview release/materialsLibrary/babylon.gridMaterial.d.ts
  26. 3 0
      dist/preview release/materialsLibrary/babylon.gridMaterial.js
  27. 1 1
      dist/preview release/materialsLibrary/babylon.gridMaterial.min.js
  28. 1 0
      dist/preview release/materialsLibrary/babylon.lavaMaterial.d.ts
  29. 3 0
      dist/preview release/materialsLibrary/babylon.lavaMaterial.js
  30. 1 1
      dist/preview release/materialsLibrary/babylon.lavaMaterial.min.js
  31. 1 0
      dist/preview release/materialsLibrary/babylon.normalMaterial.d.ts
  32. 3 0
      dist/preview release/materialsLibrary/babylon.normalMaterial.js
  33. 1 1
      dist/preview release/materialsLibrary/babylon.normalMaterial.min.js
  34. 1 0
      dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.d.ts
  35. 3 0
      dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.js
  36. 1 1
      dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js
  37. 1 0
      dist/preview release/materialsLibrary/babylon.simpleMaterial.d.ts
  38. 3 0
      dist/preview release/materialsLibrary/babylon.simpleMaterial.js
  39. 1 1
      dist/preview release/materialsLibrary/babylon.simpleMaterial.min.js
  40. 1 0
      dist/preview release/materialsLibrary/babylon.skyMaterial.d.ts
  41. 3 0
      dist/preview release/materialsLibrary/babylon.skyMaterial.js
  42. 1 1
      dist/preview release/materialsLibrary/babylon.skyMaterial.min.js
  43. 1 0
      dist/preview release/materialsLibrary/babylon.terrainMaterial.d.ts
  44. 3 0
      dist/preview release/materialsLibrary/babylon.terrainMaterial.js
  45. 1 1
      dist/preview release/materialsLibrary/babylon.terrainMaterial.min.js
  46. 1 0
      dist/preview release/materialsLibrary/babylon.triPlanarMaterial.d.ts
  47. 3 0
      dist/preview release/materialsLibrary/babylon.triPlanarMaterial.js
  48. 1 1
      dist/preview release/materialsLibrary/babylon.triPlanarMaterial.min.js
  49. 1 0
      dist/preview release/materialsLibrary/babylon.waterMaterial.d.ts
  50. 3 0
      dist/preview release/materialsLibrary/babylon.waterMaterial.js
  51. 1 1
      dist/preview release/materialsLibrary/babylon.waterMaterial.min.js
  52. 1 0
      dist/preview release/what's new.md
  53. 1 1
      inspector/src/helpers/Helpers.ts
  54. 4 0
      materialsLibrary/src/cell/babylon.cellMaterial.ts
  55. 4 0
      materialsLibrary/src/fire/babylon.fireMaterial.ts
  56. 4 0
      materialsLibrary/src/fur/babylon.furMaterial.ts
  57. 4 0
      materialsLibrary/src/gradient/babylon.gradientMaterial.ts
  58. 4 0
      materialsLibrary/src/grid/babylon.gridmaterial.ts
  59. 4 0
      materialsLibrary/src/lava/babylon.lavaMaterial.ts
  60. 4 0
      materialsLibrary/src/normal/babylon.normalMaterial.ts
  61. 4 0
      materialsLibrary/src/shadowOnly/babylon.shadowOnlyMaterial.ts
  62. 4 0
      materialsLibrary/src/simple/babylon.simpleMaterial.ts
  63. 4 0
      materialsLibrary/src/sky/babylon.skyMaterial.ts
  64. 4 0
      materialsLibrary/src/terrain/babylon.terrainMaterial.ts
  65. 4 0
      materialsLibrary/src/triPlanar/babylon.triPlanarMaterial.ts
  66. 4 0
      materialsLibrary/src/water/babylon.waterMaterial.ts
  67. 2 2
      src/Cameras/Inputs/babylon.arcRotateCameraGamepadInput.ts
  68. 1 1
      src/Cameras/Inputs/babylon.arcRotateCameraKeyboardMoveInput.ts
  69. 1 1
      src/Cameras/Inputs/babylon.arcRotateCameraMouseWheelInput.ts
  70. 1 1
      src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.ts
  71. 1 1
      src/Cameras/Inputs/babylon.arcRotateCameraVRDeviceOrientationInput.ts
  72. 1 1
      src/Cameras/Inputs/babylon.freeCameraDeviceOrientationInput.ts
  73. 1 1
      src/Cameras/Inputs/babylon.freeCameraGamepadInput.ts
  74. 1 1
      src/Cameras/Inputs/babylon.freeCameraKeyboardMoveInput.ts
  75. 3 3
      src/Cameras/Inputs/babylon.freeCameraMouseInput.ts
  76. 1 1
      src/Cameras/Inputs/babylon.freeCameraTouchInput.ts
  77. 1 1
      src/Cameras/Inputs/babylon.freeCameraVirtualJoystickInput.ts
  78. 4 4
      src/Cameras/babylon.cameraInputsManager.ts
  79. 3 1
      src/Materials/PBR/babylon.pbrBaseMaterial.ts
  80. 4 0
      src/Materials/PBR/babylon.pbrBaseSimpleMaterial.ts
  81. 4 0
      src/Materials/Textures/babylon.baseTexture.ts
  82. 4 0
      src/Materials/Textures/babylon.texture.ts
  83. 4 0
      src/Materials/babylon.colorCurves.ts
  84. 4 0
      src/Materials/babylon.imageProcessingConfiguration.ts
  85. 4 0
      src/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts
  86. 4 0
      src/PostProcess/babylon.imageProcessingPostProcess.ts
  87. 4 0
      src/PostProcess/babylon.volumetricLightScatteringPostProcess.ts
  88. 79 11
      src/Tools/babylon.decorators.ts
  89. 1 1
      src/Tools/babylon.tools.ts

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6292 - 6284
dist/preview release/babylon.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 40 - 40
dist/preview release/babylon.js


+ 102 - 26
dist/preview release/babylon.max.js

@@ -4857,13 +4857,59 @@ var BABYLON;
 
 var BABYLON;
 (function (BABYLON) {
+    var __decoratorInitialStore = {};
+    var __mergedStore = {};
+    function getDirectStore(target) {
+        var classKey = target.getClassName();
+        if (!__decoratorInitialStore[classKey]) {
+            __decoratorInitialStore[classKey] = {};
+        }
+        return __decoratorInitialStore[classKey];
+    }
+    /**
+     * Return the list of properties flagged as serializable
+     * @param target: host object
+     */
+    function getMergedStore(target) {
+        var classKey = target.getClassName();
+        if (__mergedStore[classKey]) {
+            return __mergedStore[classKey];
+        }
+        __mergedStore[classKey] = {};
+        var store = __mergedStore[classKey];
+        var currentTarget = target;
+        var currentKey = classKey;
+        while (currentKey) {
+            var initialStore = __decoratorInitialStore[currentKey];
+            for (var property in initialStore) {
+                store[property] = initialStore[property];
+            }
+            var parent_1 = void 0;
+            var done = false;
+            do {
+                parent_1 = Object.getPrototypeOf(currentTarget);
+                if (!parent_1.getClassName) {
+                    done = true;
+                    break;
+                }
+                if (parent_1.getClassName() !== currentKey) {
+                    break;
+                }
+                currentTarget = parent_1;
+            } while (parent_1);
+            if (done) {
+                break;
+            }
+            currentKey = parent_1.getClassName();
+            currentTarget = parent_1;
+        }
+        return store;
+    }
     function generateSerializableMember(type, sourceName) {
         return function (target, propertyKey) {
-            if (!target.__serializableMembers) {
-                target.__serializableMembers = {};
-            }
-            if (!target.__serializableMembers[propertyKey]) {
-                target.__serializableMembers[propertyKey] = { type: type, sourceName: sourceName };
+            var classStore = getDirectStore(target);
+            if (!classStore[propertyKey]) {
+                classStore[propertyKey] = { type: type, sourceName: sourceName };
             }
         };
     }
@@ -4941,9 +4987,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 serializationObject.tags = BABYLON.Tags.GetTags(entity);
             }
+            var serializedProperties = getMergedStore(entity);
             // Properties
-            for (var property in entity.__serializableMembers) {
-                var propertyDescriptor = entity.__serializableMembers[property];
+            for (var property in serializedProperties) {
+                var propertyDescriptor = serializedProperties[property];
                 var targetPropertyName = propertyDescriptor.sourceName || property;
                 var propertyType = propertyDescriptor.type;
                 var sourceProperty = entity[property];
@@ -4990,9 +5037,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 BABYLON.Tags.AddTagsTo(destination, source.tags);
             }
+            var classStore = getMergedStore(destination);
             // Properties
-            for (var property in destination.__serializableMembers) {
-                var propertyDescriptor = destination.__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[propertyDescriptor.sourceName || property];
                 var propertyType = propertyDescriptor.type;
                 if (sourceProperty !== undefined && sourceProperty !== null) {
@@ -5038,9 +5086,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 BABYLON.Tags.AddTagsTo(destination, source.tags);
             }
+            var classStore = getMergedStore(destination);
             // Properties
-            for (var property in destination.__serializableMembers) {
-                var propertyDescriptor = destination.__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[property];
                 var propertyType = propertyDescriptor.type;
                 if (sourceProperty !== undefined && sourceProperty !== null) {
@@ -6309,7 +6358,7 @@ var BABYLON;
          * @param object the object to get the class name from
          * @return the name of the class, will be "object" for a custom data type not using the @className decorator
          */
-        Tools.getClassName = function (object, isType) {
+        Tools.GetClassName = function (object, isType) {
             if (isType === void 0) { isType = false; }
             var name = null;
             if (!isType && object.getClassName) {
@@ -19339,6 +19388,9 @@ var BABYLON;
         BaseTexture.prototype.toString = function () {
             return this.name;
         };
+        BaseTexture.prototype.getClassName = function () {
+            return "BaseTexture";
+        };
         Object.defineProperty(BaseTexture.prototype, "onDispose", {
             set: function (callback) {
                 if (this._onDisposeObserver) {
@@ -19891,6 +19943,9 @@ var BABYLON;
             }
             return serializationObject;
         };
+        Texture.prototype.getClassName = function () {
+            return "Texture";
+        };
         // Statics
         Texture.CreateFromBase64String = function (data, name, scene, noMipmap, invertY, samplingMode, onLoad, onError, format) {
             if (samplingMode === void 0) { samplingMode = Texture.TRILINEAR_SAMPLINGMODE; }
@@ -30995,6 +31050,9 @@ var BABYLON;
                 _this._markAllSubMeshesAsImageProcessingDirty();
             });
         };
+        PBRBaseMaterial.prototype.getClassName = function () {
+            return "PBRBaseMaterial";
+        };
         Object.defineProperty(PBRBaseMaterial.prototype, "useLogarithmicDepth", {
             get: function () {
                 return this._useLogarithmicDepth;
@@ -31913,6 +31971,9 @@ var BABYLON;
                 }
                 return activeTextures;
             };
+            PBRBaseSimpleMaterial.prototype.getClassName = function () {
+                return "PBRBaseSimpleMaterial";
+            };
             return PBRBaseSimpleMaterial;
         }(BABYLON.PBRBaseMaterial));
         __decorate([
@@ -32895,7 +32956,7 @@ var BABYLON;
         CameraInputsManager.prototype.removeByType = function (inputType) {
             for (var cam in this.attached) {
                 var input = this.attached[cam];
-                if (input.getTypeName() === inputType) {
+                if (input.getClassName() === inputType) {
                     input.detachControl(this.attachedElement);
                     delete this.attached[cam];
                     this.rebuildInputCheck();
@@ -32956,7 +33017,7 @@ var BABYLON;
             for (var cam in this.attached) {
                 var input = this.attached[cam];
                 var res = BABYLON.SerializationHelper.Serialize(input);
-                inputs[input.getTypeName()] = res;
+                inputs[input.getClassName()] = res;
             }
             serializedCamera.inputsmgr = inputs;
         };
@@ -32976,7 +33037,7 @@ var BABYLON;
             else {
                 //2016-03-08 this part is for managing backward compatibility
                 for (var n in this.attached) {
-                    var construct = BABYLON.CameraInputTypes[this.attached[n].getTypeName()];
+                    var construct = BABYLON.CameraInputTypes[this.attached[n].getClassName()];
                     if (construct) {
                         var input = BABYLON.SerializationHelper.Parse(function () { return new construct(); }, parsedCamera, null);
                         this.remove(this.attached[n]);
@@ -33095,7 +33156,7 @@ var BABYLON;
                 this.previousPosition = null;
             }
         };
-        FreeCameraMouseInput.prototype.getTypeName = function () {
+        FreeCameraMouseInput.prototype.getClassName = function () {
             return "FreeCameraMouseInput";
         };
         FreeCameraMouseInput.prototype.getSimpleName = function () {
@@ -33205,7 +33266,7 @@ var BABYLON;
                 }
             }
         };
-        FreeCameraKeyboardMoveInput.prototype.getTypeName = function () {
+        FreeCameraKeyboardMoveInput.prototype.getClassName = function () {
             return "FreeCameraKeyboardMoveInput";
         };
         FreeCameraKeyboardMoveInput.prototype._onLostFocus = function (e) {
@@ -33852,7 +33913,7 @@ var BABYLON;
                 }
             }
         };
-        ArcRotateCameraKeyboardMoveInput.prototype.getTypeName = function () {
+        ArcRotateCameraKeyboardMoveInput.prototype.getClassName = function () {
             return "ArcRotateCameraKeyboardMoveInput";
         };
         ArcRotateCameraKeyboardMoveInput.prototype.getSimpleName = function () {
@@ -33916,7 +33977,7 @@ var BABYLON;
                 this._wheel = null;
             }
         };
-        ArcRotateCameraMouseWheelInput.prototype.getTypeName = function () {
+        ArcRotateCameraMouseWheelInput.prototype.getClassName = function () {
             return "ArcRotateCameraMouseWheelInput";
         };
         ArcRotateCameraMouseWheelInput.prototype.getSimpleName = function () {
@@ -34117,7 +34178,7 @@ var BABYLON;
                 { name: "blur", handler: this._onLostFocus }
             ]);
         };
-        ArcRotateCameraPointersInput.prototype.getTypeName = function () {
+        ArcRotateCameraPointersInput.prototype.getClassName = function () {
             return "ArcRotateCameraPointersInput";
         };
         ArcRotateCameraPointersInput.prototype.getSimpleName = function () {
@@ -48734,7 +48795,7 @@ var BABYLON;
                 }
             }
         };
-        FreeCameraTouchInput.prototype.getTypeName = function () {
+        FreeCameraTouchInput.prototype.getClassName = function () {
             return "FreeCameraTouchInput";
         };
         FreeCameraTouchInput.prototype.getSimpleName = function () {
@@ -49288,7 +49349,7 @@ var BABYLON;
                 }
             }
         };
-        FreeCameraGamepadInput.prototype.getTypeName = function () {
+        FreeCameraGamepadInput.prototype.getClassName = function () {
             return "FreeCameraGamepadInput";
         };
         FreeCameraGamepadInput.prototype.getSimpleName = function () {
@@ -49361,7 +49422,7 @@ var BABYLON;
                 }
             }
         };
-        ArcRotateCameraGamepadInput.prototype.getTypeName = function () {
+        ArcRotateCameraGamepadInput.prototype.getClassName = function () {
             return "ArcRotateCameraGamepadInput";
         };
         ArcRotateCameraGamepadInput.prototype.getSimpleName = function () {
@@ -50850,6 +50911,9 @@ var BABYLON;
             this._renderEffectsForIsolatedPass = new Array();
             this._cameras = [];
         }
+        PostProcessRenderPipeline.prototype.getClassName = function () {
+            return "PostProcessRenderPipeline";
+        };
         Object.defineProperty(PostProcessRenderPipeline.prototype, "isSupported", {
             get: function () {
                 for (var renderEffectName in this._renderEffects) {
@@ -53375,6 +53439,9 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        VolumetricLightScatteringPostProcess.prototype.getClassName = function () {
+            return "VolumetricLightScatteringPostProcess";
+        };
         VolumetricLightScatteringPostProcess.prototype.isReady = function (subMesh, useInstances) {
             var mesh = subMesh.getMesh();
             // Render this.mesh as default
@@ -54107,6 +54174,9 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        ImageProcessingPostProcess.prototype.getClassName = function () {
+            return "ImageProcessingPostProcess";
+        };
         ImageProcessingPostProcess.prototype._updateParameters = function () {
             this._defines.FROMLINEARSPACE = this._fromLinearSpace;
             this.imageProcessingConfiguration.prepareDefines(this._defines);
@@ -63091,6 +63161,9 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        ColorCurves.prototype.getClassName = function () {
+            return "ColorCurves";
+        };
         /**
          * Binds the color curves to the shader.
          * @param colorCurves The color curve to bind
@@ -63910,7 +63983,7 @@ var BABYLON;
             this._camera.rotationQuaternion.z *= -1;
             this._camera.rotationQuaternion.w *= -1;
         };
-        FreeCameraDeviceOrientationInput.prototype.getTypeName = function () {
+        FreeCameraDeviceOrientationInput.prototype.getClassName = function () {
             return "FreeCameraDeviceOrientationInput";
         };
         FreeCameraDeviceOrientationInput.prototype.getSimpleName = function () {
@@ -63961,7 +64034,7 @@ var BABYLON;
         ArcRotateCameraVRDeviceOrientationInput.prototype.detachControl = function (element) {
             window.removeEventListener("deviceorientation", this._deviceOrientationHandler);
         };
-        ArcRotateCameraVRDeviceOrientationInput.prototype.getTypeName = function () {
+        ArcRotateCameraVRDeviceOrientationInput.prototype.getClassName = function () {
             return "ArcRotateCameraVRDeviceOrientationInput";
         };
         ArcRotateCameraVRDeviceOrientationInput.prototype.getSimpleName = function () {
@@ -65012,7 +65085,7 @@ var BABYLON;
             this._leftjoystick.releaseCanvas();
             this._rightjoystick.releaseCanvas();
         };
-        FreeCameraVirtualJoystickInput.prototype.getTypeName = function () {
+        FreeCameraVirtualJoystickInput.prototype.getClassName = function () {
             return "FreeCameraVirtualJoystickInput";
         };
         FreeCameraVirtualJoystickInput.prototype.getSimpleName = function () {
@@ -67976,6 +68049,9 @@ var BABYLON;
         ImageProcessingConfiguration.prototype._updateParameters = function () {
             this.onUpdateParameters.notifyObservers(this);
         };
+        ImageProcessingConfiguration.prototype.getClassName = function () {
+            return "ImageProcessingConfiguration";
+        };
         /**
          * Prepare the list of uniforms associated with the Image Processing effects.
          * @param uniformsList The list of uniforms used in the effect

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6292 - 6284
dist/preview release/babylon.module.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 40 - 40
dist/preview release/babylon.worker.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6435 - 6427
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 27 - 27
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 94 - 18
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -4857,13 +4857,59 @@ var BABYLON;
 
 var BABYLON;
 (function (BABYLON) {
+    var __decoratorInitialStore = {};
+    var __mergedStore = {};
+    function getDirectStore(target) {
+        var classKey = target.getClassName();
+        if (!__decoratorInitialStore[classKey]) {
+            __decoratorInitialStore[classKey] = {};
+        }
+        return __decoratorInitialStore[classKey];
+    }
+    /**
+     * Return the list of properties flagged as serializable
+     * @param target: host object
+     */
+    function getMergedStore(target) {
+        var classKey = target.getClassName();
+        if (__mergedStore[classKey]) {
+            return __mergedStore[classKey];
+        }
+        __mergedStore[classKey] = {};
+        var store = __mergedStore[classKey];
+        var currentTarget = target;
+        var currentKey = classKey;
+        while (currentKey) {
+            var initialStore = __decoratorInitialStore[currentKey];
+            for (var property in initialStore) {
+                store[property] = initialStore[property];
+            }
+            var parent_1 = void 0;
+            var done = false;
+            do {
+                parent_1 = Object.getPrototypeOf(currentTarget);
+                if (!parent_1.getClassName) {
+                    done = true;
+                    break;
+                }
+                if (parent_1.getClassName() !== currentKey) {
+                    break;
+                }
+                currentTarget = parent_1;
+            } while (parent_1);
+            if (done) {
+                break;
+            }
+            currentKey = parent_1.getClassName();
+            currentTarget = parent_1;
+        }
+        return store;
+    }
     function generateSerializableMember(type, sourceName) {
         return function (target, propertyKey) {
-            if (!target.__serializableMembers) {
-                target.__serializableMembers = {};
-            }
-            if (!target.__serializableMembers[propertyKey]) {
-                target.__serializableMembers[propertyKey] = { type: type, sourceName: sourceName };
+            var classStore = getDirectStore(target);
+            if (!classStore[propertyKey]) {
+                classStore[propertyKey] = { type: type, sourceName: sourceName };
             }
         };
     }
@@ -4941,9 +4987,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 serializationObject.tags = BABYLON.Tags.GetTags(entity);
             }
+            var serializedProperties = getMergedStore(entity);
             // Properties
-            for (var property in entity.__serializableMembers) {
-                var propertyDescriptor = entity.__serializableMembers[property];
+            for (var property in serializedProperties) {
+                var propertyDescriptor = serializedProperties[property];
                 var targetPropertyName = propertyDescriptor.sourceName || property;
                 var propertyType = propertyDescriptor.type;
                 var sourceProperty = entity[property];
@@ -4990,9 +5037,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 BABYLON.Tags.AddTagsTo(destination, source.tags);
             }
+            var classStore = getMergedStore(destination);
             // Properties
-            for (var property in destination.__serializableMembers) {
-                var propertyDescriptor = destination.__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[propertyDescriptor.sourceName || property];
                 var propertyType = propertyDescriptor.type;
                 if (sourceProperty !== undefined && sourceProperty !== null) {
@@ -5038,9 +5086,10 @@ var BABYLON;
             if (BABYLON.Tags) {
                 BABYLON.Tags.AddTagsTo(destination, source.tags);
             }
+            var classStore = getMergedStore(destination);
             // Properties
-            for (var property in destination.__serializableMembers) {
-                var propertyDescriptor = destination.__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[property];
                 var propertyType = propertyDescriptor.type;
                 if (sourceProperty !== undefined && sourceProperty !== null) {
@@ -6309,7 +6358,7 @@ var BABYLON;
          * @param object the object to get the class name from
          * @return the name of the class, will be "object" for a custom data type not using the @className decorator
          */
-        Tools.getClassName = function (object, isType) {
+        Tools.GetClassName = function (object, isType) {
             if (isType === void 0) { isType = false; }
             var name = null;
             if (!isType && object.getClassName) {
@@ -19339,6 +19388,9 @@ var BABYLON;
         BaseTexture.prototype.toString = function () {
             return this.name;
         };
+        BaseTexture.prototype.getClassName = function () {
+            return "BaseTexture";
+        };
         Object.defineProperty(BaseTexture.prototype, "onDispose", {
             set: function (callback) {
                 if (this._onDisposeObserver) {
@@ -19891,6 +19943,9 @@ var BABYLON;
             }
             return serializationObject;
         };
+        Texture.prototype.getClassName = function () {
+            return "Texture";
+        };
         // Statics
         Texture.CreateFromBase64String = function (data, name, scene, noMipmap, invertY, samplingMode, onLoad, onError, format) {
             if (samplingMode === void 0) { samplingMode = Texture.TRILINEAR_SAMPLINGMODE; }
@@ -30462,7 +30517,7 @@ var BABYLON;
         CameraInputsManager.prototype.removeByType = function (inputType) {
             for (var cam in this.attached) {
                 var input = this.attached[cam];
-                if (input.getTypeName() === inputType) {
+                if (input.getClassName() === inputType) {
                     input.detachControl(this.attachedElement);
                     delete this.attached[cam];
                     this.rebuildInputCheck();
@@ -30523,7 +30578,7 @@ var BABYLON;
             for (var cam in this.attached) {
                 var input = this.attached[cam];
                 var res = BABYLON.SerializationHelper.Serialize(input);
-                inputs[input.getTypeName()] = res;
+                inputs[input.getClassName()] = res;
             }
             serializedCamera.inputsmgr = inputs;
         };
@@ -30543,7 +30598,7 @@ var BABYLON;
             else {
                 //2016-03-08 this part is for managing backward compatibility
                 for (var n in this.attached) {
-                    var construct = BABYLON.CameraInputTypes[this.attached[n].getTypeName()];
+                    var construct = BABYLON.CameraInputTypes[this.attached[n].getClassName()];
                     if (construct) {
                         var input = BABYLON.SerializationHelper.Parse(function () { return new construct(); }, parsedCamera, null);
                         this.remove(this.attached[n]);
@@ -30939,7 +30994,7 @@ var BABYLON;
                 }
             }
         };
-        ArcRotateCameraKeyboardMoveInput.prototype.getTypeName = function () {
+        ArcRotateCameraKeyboardMoveInput.prototype.getClassName = function () {
             return "ArcRotateCameraKeyboardMoveInput";
         };
         ArcRotateCameraKeyboardMoveInput.prototype.getSimpleName = function () {
@@ -31003,7 +31058,7 @@ var BABYLON;
                 this._wheel = null;
             }
         };
-        ArcRotateCameraMouseWheelInput.prototype.getTypeName = function () {
+        ArcRotateCameraMouseWheelInput.prototype.getClassName = function () {
             return "ArcRotateCameraMouseWheelInput";
         };
         ArcRotateCameraMouseWheelInput.prototype.getSimpleName = function () {
@@ -31204,7 +31259,7 @@ var BABYLON;
                 { name: "blur", handler: this._onLostFocus }
             ]);
         };
-        ArcRotateCameraPointersInput.prototype.getTypeName = function () {
+        ArcRotateCameraPointersInput.prototype.getClassName = function () {
             return "ArcRotateCameraPointersInput";
         };
         ArcRotateCameraPointersInput.prototype.getSimpleName = function () {
@@ -36111,6 +36166,9 @@ var BABYLON;
                 _this._markAllSubMeshesAsImageProcessingDirty();
             });
         };
+        PBRBaseMaterial.prototype.getClassName = function () {
+            return "PBRBaseMaterial";
+        };
         Object.defineProperty(PBRBaseMaterial.prototype, "useLogarithmicDepth", {
             get: function () {
                 return this._useLogarithmicDepth;
@@ -37029,6 +37087,9 @@ var BABYLON;
                 }
                 return activeTextures;
             };
+            PBRBaseSimpleMaterial.prototype.getClassName = function () {
+                return "PBRBaseSimpleMaterial";
+            };
             return PBRBaseSimpleMaterial;
         }(BABYLON.PBRBaseMaterial));
         __decorate([
@@ -40341,6 +40402,9 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        ImageProcessingPostProcess.prototype.getClassName = function () {
+            return "ImageProcessingPostProcess";
+        };
         ImageProcessingPostProcess.prototype._updateParameters = function () {
             this._defines.FROMLINEARSPACE = this._fromLinearSpace;
             this.imageProcessingConfiguration.prepareDefines(this._defines);
@@ -40889,6 +40953,9 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        ColorCurves.prototype.getClassName = function () {
+            return "ColorCurves";
+        };
         /**
          * Binds the color curves to the shader.
          * @param colorCurves The color curve to bind
@@ -41389,6 +41456,9 @@ var BABYLON;
             this._renderEffectsForIsolatedPass = new Array();
             this._cameras = [];
         }
+        PostProcessRenderPipeline.prototype.getClassName = function () {
+            return "PostProcessRenderPipeline";
+        };
         Object.defineProperty(PostProcessRenderPipeline.prototype, "isSupported", {
             get: function () {
                 for (var renderEffectName in this._renderEffects) {
@@ -42085,6 +42155,9 @@ var BABYLON;
         ImageProcessingConfiguration.prototype._updateParameters = function () {
             this.onUpdateParameters.notifyObservers(this);
         };
+        ImageProcessingConfiguration.prototype.getClassName = function () {
+            return "ImageProcessingConfiguration";
+        };
         /**
          * Prepare the list of uniforms associated with the Image Processing effects.
          * @param uniformsList The list of uniforms used in the effect
@@ -49117,6 +49190,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.GridMaterial";
             return serializationObject;
         };
+        GridMaterial.prototype.getClassName = function () {
+            return "GridMaterial";
+        };
         GridMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new GridMaterial(source.name, scene); }, source, scene, rootUrl);
         };

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6435 - 6427
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.module.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/inspector/babylon.inspector.bundle.js


+ 1 - 1
dist/preview release/inspector/babylon.inspector.js

@@ -2479,7 +2479,7 @@ var INSPECTOR;
          */
         Helpers.GET_TYPE = function (obj) {
             if (obj != null && obj != undefined) {
-                var classname = BABYLON.Tools.getClassName(obj);
+                var classname = BABYLON.Tools.GetClassName(obj);
                 if (!classname || classname === 'object') {
                     classname = obj.constructor.name;
                     // classname is undefined in IE11

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/inspector/babylon.inspector.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.cellMaterial.d.ts

@@ -23,6 +23,7 @@ declare module BABYLON {
         getActiveTextures(): BaseTexture[];
         hasTexture(texture: BaseTexture): boolean;
         dispose(forceDisposeEffect?: boolean): void;
+        getClassName(): string;
         clone(name: string): CellMaterial;
         serialize(): any;
         static Parse(source: any, scene: Scene, rootUrl: string): CellMaterial;

+ 3 - 0
dist/preview release/materialsLibrary/babylon.cellMaterial.js

@@ -239,6 +239,9 @@ var BABYLON;
             }
             _super.prototype.dispose.call(this, forceDisposeEffect);
         };
+        CellMaterial.prototype.getClassName = function () {
+            return "CellMaterial";
+        };
         CellMaterial.prototype.clone = function (name) {
             var _this = this;
             return BABYLON.SerializationHelper.Clone(function () { return new CellMaterial(name, _this.getScene()); }, this);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.cellMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.fireMaterial.d.ts

@@ -21,6 +21,7 @@ declare module BABYLON {
         getAnimatables(): IAnimatable[];
         getActiveTextures(): BaseTexture[];
         hasTexture(texture: BaseTexture): boolean;
+        getClassName(): string;
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): FireMaterial;
         serialize(): any;

+ 3 - 0
dist/preview release/materialsLibrary/babylon.fireMaterial.js

@@ -237,6 +237,9 @@ var BABYLON;
             }
             return false;
         };
+        FireMaterial.prototype.getClassName = function () {
+            return "FireMaterial";
+        };
         FireMaterial.prototype.dispose = function (forceDisposeEffect) {
             if (this._diffuseTexture) {
                 this._diffuseTexture.dispose();

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.fireMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.furMaterial.d.ts

@@ -38,6 +38,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): FurMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): FurMaterial;
         static GenerateTexture(name: string, scene: Scene): DynamicTexture;
         static FurifyMesh(sourceMesh: Mesh, quality: number): Mesh[];

+ 3 - 0
dist/preview release/materialsLibrary/babylon.furMaterial.js

@@ -332,6 +332,9 @@ var BABYLON;
             }
             return serializationObject;
         };
+        FurMaterial.prototype.getClassName = function () {
+            return "FurMaterial";
+        };
         // Statics
         FurMaterial.Parse = function (source, scene, rootUrl) {
             var material = BABYLON.SerializationHelper.Parse(function () { return new FurMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.furMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.gradientMaterial.d.ts

@@ -23,6 +23,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): GradientMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): GradientMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.gradientMaterial.js

@@ -244,6 +244,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.GradientMaterial";
             return serializationObject;
         };
+        GradientMaterial.prototype.getClassName = function () {
+            return "GradientMaterial";
+        };
         // Statics
         GradientMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new GradientMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.gradientMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.gridMaterial.d.ts

@@ -50,6 +50,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): GridMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): GridMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.gridMaterial.js

@@ -161,6 +161,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.GridMaterial";
             return serializationObject;
         };
+        GridMaterial.prototype.getClassName = function () {
+            return "GridMaterial";
+        };
         GridMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new GridMaterial(source.name, scene); }, source, scene, rootUrl);
         };

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.gridMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.lavaMaterial.d.ts

@@ -30,6 +30,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): LavaMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): LavaMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.lavaMaterial.js

@@ -305,6 +305,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.LavaMaterial";
             return serializationObject;
         };
+        LavaMaterial.prototype.getClassName = function () {
+            return "LavaMaterial";
+        };
         // Statics
         LavaMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new LavaMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.lavaMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.normalMaterial.d.ts

@@ -23,6 +23,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): NormalMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): NormalMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.normalMaterial.js

@@ -278,6 +278,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.NormalMaterial";
             return serializationObject;
         };
+        NormalMaterial.prototype.getClassName = function () {
+            return "NormalMaterial";
+        };
         // Statics
         NormalMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new NormalMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.normalMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.d.ts

@@ -12,6 +12,7 @@ declare module BABYLON {
         bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
         clone(name: string): ShadowOnlyMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): ShadowOnlyMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.js

@@ -172,6 +172,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.ShadowOnlyMaterial";
             return serializationObject;
         };
+        ShadowOnlyMaterial.prototype.getClassName = function () {
+            return "ShadowOnlyMaterial";
+        };
         // Statics
         ShadowOnlyMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new ShadowOnlyMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.simpleMaterial.d.ts

@@ -23,6 +23,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): SimpleMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): SimpleMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.simpleMaterial.js

@@ -245,6 +245,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.SimpleMaterial";
             return serializationObject;
         };
+        SimpleMaterial.prototype.getClassName = function () {
+            return "SimpleMaterial";
+        };
         // Statics
         SimpleMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new SimpleMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.simpleMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.skyMaterial.d.ts

@@ -23,6 +23,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): SkyMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): SkyMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.skyMaterial.js

@@ -179,6 +179,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.SkyMaterial";
             return serializationObject;
         };
+        SkyMaterial.prototype.getClassName = function () {
+            return "SkyMaterial";
+        };
         // Statics
         SkyMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new SkyMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.skyMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.terrainMaterial.d.ts

@@ -36,6 +36,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): TerrainMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): TerrainMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.terrainMaterial.js

@@ -317,6 +317,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.TerrainMaterial";
             return serializationObject;
         };
+        TerrainMaterial.prototype.getClassName = function () {
+            return "TerrainMaterial";
+        };
         // Statics
         TerrainMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new TerrainMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.terrainMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.triPlanarMaterial.d.ts

@@ -36,6 +36,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): TriPlanarMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): TriPlanarMaterial;
     }
 }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.triPlanarMaterial.js

@@ -312,6 +312,9 @@ var BABYLON;
             serializationObject.customType = "BABYLON.TriPlanarMaterial";
             return serializationObject;
         };
+        TriPlanarMaterial.prototype.getClassName = function () {
+            return "TriPlanarMaterial";
+        };
         // Statics
         TriPlanarMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new TriPlanarMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.triPlanarMaterial.min.js


+ 1 - 0
dist/preview release/materialsLibrary/babylon.waterMaterial.d.ts

@@ -98,6 +98,7 @@ declare module BABYLON {
         dispose(forceDisposeEffect?: boolean): void;
         clone(name: string): WaterMaterial;
         serialize(): any;
+        getClassName(): string;
         static Parse(source: any, scene: Scene, rootUrl: string): WaterMaterial;
         static CreateDefaultMesh(name: string, scene: Scene): Mesh;
     }

+ 3 - 0
dist/preview release/materialsLibrary/babylon.waterMaterial.js

@@ -498,6 +498,9 @@ var BABYLON;
             serializationObject.refractionTexture.isRenderTarget = true;
             return serializationObject;
         };
+        WaterMaterial.prototype.getClassName = function () {
+            return "WaterMaterial";
+        };
         // Statics
         WaterMaterial.Parse = function (source, scene, rootUrl) {
             return BABYLON.SerializationHelper.Parse(function () { return new WaterMaterial(source.name, scene); }, source, scene, rootUrl);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/materialsLibrary/babylon.waterMaterial.min.js


+ 1 - 0
dist/preview release/what's new.md

@@ -5,6 +5,7 @@
 - Engine can now be initialized with an existing webgl context ([deltakosh](https://github.com/deltakosh))
 
 ## Updates
+- Better serialization support ([deltakosh](https://github.com/deltakosh))
 - Introduced `performanceMonitor` class to get better FPS analysis ([deltakosh](https://github.com/deltakosh))
 - GUI: Added support for pointer move events on projected UI ([deltakosh](https://github.com/deltakosh))
 - Normals are generated automatically by StandardMaterial if meshes do not have normals ([deltakosh](https://github.com/deltakosh))

+ 1 - 1
inspector/src/helpers/Helpers.ts

@@ -8,7 +8,7 @@ module INSPECTOR {
          */
         public static GET_TYPE(obj: any): string {
             if (obj != null && obj != undefined) {
-                let classname = BABYLON.Tools.getClassName(obj);
+                let classname = BABYLON.Tools.GetClassName(obj);
                 if (!classname || classname === 'object') {
                     classname = obj.constructor.name;
                     // classname is undefined in IE11

+ 4 - 0
materialsLibrary/src/cell/babylon.cellMaterial.ts

@@ -296,6 +296,10 @@ module BABYLON {
             super.dispose(forceDisposeEffect);
         }
 
+        public getClassName(): string {
+            return "CellMaterial";
+        }
+
         public clone(name: string): CellMaterial {
             return SerializationHelper.Clone<CellMaterial>(() => new CellMaterial(name, this.getScene()), this);
         }

+ 4 - 0
materialsLibrary/src/fire/babylon.fireMaterial.ts

@@ -296,6 +296,10 @@ module BABYLON {
             return false;    
         }         
 
+        public getClassName(): string {
+            return "FireMaterial";
+        }        
+
         public dispose(forceDisposeEffect?: boolean): void {
             if (this._diffuseTexture) {
                 this._diffuseTexture.dispose();

+ 4 - 0
materialsLibrary/src/fur/babylon.furMaterial.ts

@@ -430,6 +430,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "FurMaterial";
+        }          
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): FurMaterial {
             var material = SerializationHelper.Parse(() => new FurMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/gradient/babylon.gradientMaterial.ts

@@ -296,6 +296,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "GradientMaterial";
+        }              
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): GradientMaterial {
             return SerializationHelper.Parse(() => new GradientMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/grid/babylon.gridmaterial.ts

@@ -192,6 +192,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "GridMaterial";
+        }             
+
         public static Parse(source: any, scene: Scene, rootUrl: string): GridMaterial {
             return SerializationHelper.Parse(() => new GridMaterial(source.name, scene), source, scene, rootUrl);
         }

+ 4 - 0
materialsLibrary/src/lava/babylon.lavaMaterial.ts

@@ -382,6 +382,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "LavaMaterial";
+        }
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): LavaMaterial {
             return SerializationHelper.Parse(() => new LavaMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/normal/babylon.normalMaterial.ts

@@ -333,6 +333,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "NormalMaterial";
+        }        
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): NormalMaterial {
             return SerializationHelper.Parse(() => new NormalMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/shadowOnly/babylon.shadowOnlyMaterial.ts

@@ -198,6 +198,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "ShadowOnlyMaterial";
+        }               
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): ShadowOnlyMaterial {
             return SerializationHelper.Parse(() => new ShadowOnlyMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/simple/babylon.simpleMaterial.ts

@@ -299,6 +299,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "SimpleMaterial";
+        }               
+        
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): SimpleMaterial {
             return SerializationHelper.Parse(() => new SimpleMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/sky/babylon.skyMaterial.ts

@@ -226,6 +226,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "SkyMaterial";
+        }            
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): SkyMaterial {
             return SerializationHelper.Parse(() => new SkyMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/terrain/babylon.terrainMaterial.ts

@@ -420,6 +420,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "TerrainMaterial";
+        }
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): TerrainMaterial {
             return SerializationHelper.Parse(() => new TerrainMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/triPlanar/babylon.triPlanarMaterial.ts

@@ -411,6 +411,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "TriPlanarMaterial";
+        }
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): TriPlanarMaterial {
             return SerializationHelper.Parse(() => new TriPlanarMaterial(source.name, scene), source, scene, rootUrl);

+ 4 - 0
materialsLibrary/src/water/babylon.waterMaterial.ts

@@ -614,6 +614,10 @@ module BABYLON {
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "WaterMaterial";
+        }        
+
         // Statics
         public static Parse(source: any, scene: Scene, rootUrl: string): WaterMaterial {
             return SerializationHelper.Parse(() => new WaterMaterial(source.name, scene), source, scene, rootUrl);

+ 2 - 2
src/Cameras/Inputs/babylon.arcRotateCameraGamepadInput.ts

@@ -63,13 +63,13 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "ArcRotateCameraGamepadInput";
         }
 
         getSimpleName() {
             return "gamepad";
-        }
+        }        
     }
 
     CameraInputTypes["ArcRotateCameraGamepadInput"] = ArcRotateCameraGamepadInput;

+ 1 - 1
src/Cameras/Inputs/babylon.arcRotateCameraKeyboardMoveInput.ts

@@ -108,7 +108,7 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "ArcRotateCameraKeyboardMoveInput";
         }
         

+ 1 - 1
src/Cameras/Inputs/babylon.arcRotateCameraMouseWheelInput.ts

@@ -41,7 +41,7 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "ArcRotateCameraMouseWheelInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.ts

@@ -231,7 +231,7 @@ module BABYLON {
             ]);
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "ArcRotateCameraPointersInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.arcRotateCameraVRDeviceOrientationInput.ts

@@ -48,7 +48,7 @@ module BABYLON {
             window.removeEventListener("deviceorientation", this._deviceOrientationHandler);
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "ArcRotateCameraVRDeviceOrientationInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.freeCameraDeviceOrientationInput.ts

@@ -62,7 +62,7 @@ module BABYLON {
             this._camera.rotationQuaternion.w *= -1;
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraDeviceOrientationInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.freeCameraGamepadInput.ts

@@ -74,7 +74,7 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraGamepadInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.freeCameraKeyboardMoveInput.ts

@@ -105,7 +105,7 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraKeyboardMoveInput";
         }
 

+ 3 - 3
src/Cameras/Inputs/babylon.freeCameraMouseInput.ts

@@ -15,7 +15,7 @@ module BABYLON {
         private previousPosition: { x: number, y: number };
 
         constructor(public touchEnabled = true) {
-        }
+        }           
 
         attachControl(element: HTMLElement, noPreventDefault?: boolean) {
             var engine = this.camera.getEngine();
@@ -129,13 +129,13 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraMouseInput";
         }
 
         getSimpleName() {
             return "mouse";
-        }
+        }      
     }
 
     CameraInputTypes["FreeCameraMouseInput"] = FreeCameraMouseInput;

+ 1 - 1
src/Cameras/Inputs/babylon.freeCameraTouchInput.ts

@@ -128,7 +128,7 @@ module BABYLON {
             }
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraTouchInput";
         }
 

+ 1 - 1
src/Cameras/Inputs/babylon.freeCameraVirtualJoystickInput.ts

@@ -49,7 +49,7 @@ module BABYLON {
             this._rightjoystick.releaseCanvas();
         }
 
-        getTypeName(): string {
+        getClassName(): string {
             return "FreeCameraVirtualJoystickInput";
         }
         

+ 4 - 4
src/Cameras/babylon.cameraInputsManager.ts

@@ -3,7 +3,7 @@ module BABYLON {
 
     export interface ICameraInput<TCamera extends BABYLON.Camera> {
         camera: TCamera;
-        getTypeName(): string;
+        getClassName(): string;
         getSimpleName(): string;
         attachControl: (element: HTMLElement, noPreventDefault?: boolean) => void;
         detachControl: (element: HTMLElement) => void;
@@ -64,7 +64,7 @@ module BABYLON {
         public removeByType(inputType: string) {
             for (var cam in this.attached) {
                 var input = this.attached[cam];
-                if (input.getTypeName() === inputType) {
+                if (input.getClassName() === inputType) {
                     input.detachControl(this.attachedElement);
                     delete this.attached[cam];
                     this.rebuildInputCheck();
@@ -137,7 +137,7 @@ module BABYLON {
             for (var cam in this.attached) {
                 var input = this.attached[cam];
                 var res = SerializationHelper.Serialize(input);
-                inputs[input.getTypeName()] = res;
+                inputs[input.getClassName()] = res;
             }
 
             serializedCamera.inputsmgr = inputs;
@@ -159,7 +159,7 @@ module BABYLON {
             } else { 
                 //2016-03-08 this part is for managing backward compatibility
                 for (var n in this.attached) {
-                    var construct = CameraInputTypes[this.attached[n].getTypeName()];
+                    var construct = CameraInputTypes[this.attached[n].getClassName()];
                     if (construct) {
                         var input = SerializationHelper.Parse(() => { return new construct() }, parsedCamera, null);
                         this.remove(this.attached[n]);

+ 3 - 1
src/Materials/PBR/babylon.pbrBaseMaterial.ts

@@ -474,7 +474,9 @@
             this._environmentBRDFTexture = TextureTools.GetEnvironmentBRDFTexture(scene);
         }
 
-        public abstract getClassName(): string;
+        public getClassName(): string {
+            return "PBRBaseMaterial";
+        }  
 
         @serialize()
         public get useLogarithmicDepth(): boolean {

+ 4 - 0
src/Materials/PBR/babylon.pbrBaseSimpleMaterial.ts

@@ -198,5 +198,9 @@
 
             this._useAmbientInGrayScale = true;
         }
+
+        public getClassName(): string {
+            return "PBRBaseSimpleMaterial";
+        }        
     }
 }

+ 4 - 0
src/Materials/Textures/babylon.baseTexture.ts

@@ -81,6 +81,10 @@
             return this.name;
         }
 
+        public getClassName(): string {
+            return "BaseTexture";
+        }             
+
         public animations = new Array<Animation>();
 
         /**

+ 4 - 0
src/Materials/Textures/babylon.texture.ts

@@ -337,6 +337,10 @@
             return serializationObject;
         }
 
+        public getClassName(): string {
+            return "Texture";
+        }     
+
         // Statics
         public static CreateFromBase64String(data: string, name: string, scene: Scene, noMipmap?: boolean, invertY?: boolean, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, onLoad: () => void = null, onError: () => void = null, format: number = Engine.TEXTUREFORMAT_RGBA): Texture {
             return new Texture("data:" + name, scene, noMipmap, invertY, samplingMode, onLoad, onError, data, false, format);

+ 4 - 0
src/Materials/babylon.colorCurves.ts

@@ -297,6 +297,10 @@
             this._shadowsExposure = value;
             this._dirty = true;
         }
+
+        public getClassName(): string {
+            return "ColorCurves";
+        }          
         
         /**
          * Binds the color curves to the shader.

+ 4 - 0
src/Materials/babylon.imageProcessingConfiguration.ts

@@ -287,6 +287,10 @@ module BABYLON {
             this.onUpdateParameters.notifyObservers(this);
         }
 
+        public getClassName(): string {
+            return "ImageProcessingConfiguration";
+        }                 
+
         /**
          * Prepare the list of uniforms associated with the Image Processing effects.
          * @param uniformsList The list of uniforms used in the effect

+ 4 - 0
src/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts

@@ -24,6 +24,10 @@ module BABYLON {
             this._cameras = [];
         }
 
+        public getClassName(): string {
+            return "PostProcessRenderPipeline";
+        }        
+
         public get isSupported(): boolean {
             for (var renderEffectName in this._renderEffects) {
                 if (!this._renderEffects[renderEffectName].isSupported) {

+ 4 - 0
src/PostProcess/babylon.imageProcessingPostProcess.ts

@@ -312,6 +312,10 @@
             };
         }
 
+        public getClassName(): string {
+            return "ImageProcessingPostProcess";
+        }           
+
         protected _updateParameters(): void {
             this._defines.FROMLINEARSPACE = this._fromLinearSpace;
             this.imageProcessingConfiguration.prepareDefines(this._defines);

+ 4 - 0
src/PostProcess/babylon.volumetricLightScatteringPostProcess.ts

@@ -131,6 +131,10 @@
             });
         }
 
+        public getClassName(): string {
+            return "VolumetricLightScatteringPostProcess";
+        }          
+
         public isReady(subMesh: SubMesh, useInstances: boolean): boolean {
             var mesh = subMesh.getMesh();
 

+ 79 - 11
src/Tools/babylon.decorators.ts

@@ -1,12 +1,74 @@
 module BABYLON {
+    var __decoratorInitialStore = {};
+    var __mergedStore = {};
+
+    function getDirectStore(target: any): any {
+        var classKey = target.getClassName();
+
+        if (!__decoratorInitialStore[classKey]) {
+            __decoratorInitialStore[classKey] = {};
+        }
+
+        return __decoratorInitialStore[classKey];
+    }
+
+    /**
+     * Return the list of properties flagged as serializable
+     * @param target: host object
+     */
+    function getMergedStore(target: any): any {
+        let classKey = target.getClassName();
+
+        if (__mergedStore[classKey]) {
+            return __mergedStore[classKey];
+        }
+
+        __mergedStore[classKey] = {};
+
+        let store = __mergedStore[classKey];
+        let currentTarget = target;
+        let currentKey = classKey;
+        while (currentKey) {
+            let initialStore = __decoratorInitialStore[currentKey];
+            for (var property in initialStore) {
+                store[property] = initialStore[property];                
+            }
+
+            let parent: any;
+            let done = false;
+
+            do {
+                parent = Object.getPrototypeOf(currentTarget);
+                if (!parent.getClassName) {
+                    done = true;
+                    break;
+                }
+
+                if (parent.getClassName() !== currentKey) {
+                    break;
+                }
+
+                currentTarget = parent;
+            }
+            while (parent);
+
+            if (done) {
+                break;
+            }
+            
+            currentKey = parent.getClassName();
+            currentTarget = parent;
+        }
+
+        return store;
+    }
+
     function generateSerializableMember(type: number, sourceName?: string) {
         return (target: any, propertyKey: string | symbol) => {
-            if (!target.__serializableMembers) {
-                target.__serializableMembers = {};
-            }
+            var classStore = getDirectStore(target);
 
-            if (!target.__serializableMembers[propertyKey]) {
-                target.__serializableMembers[propertyKey] = { type: type, sourceName: sourceName };
+            if (!classStore[propertyKey]) {
+                classStore[propertyKey] = { type: type, sourceName: sourceName };
             }
         }
     }
@@ -89,9 +151,11 @@
                 serializationObject.tags = Tags.GetTags(entity);
             }
 
+            var serializedProperties = getMergedStore(entity);
+
             // Properties
-            for (var property in (<any>entity).__serializableMembers) {
-                var propertyDescriptor = (<any>entity).__serializableMembers[property];
+            for (var property in serializedProperties) {
+                var propertyDescriptor = serializedProperties[property];
                 var targetPropertyName = propertyDescriptor.sourceName || property;
                 var propertyType = propertyDescriptor.type;
                 var sourceProperty = entity[property];
@@ -143,9 +207,11 @@
                 Tags.AddTagsTo(destination, source.tags);
             }
 
+            var classStore = getMergedStore(destination);
+
             // Properties
-            for (var property in (<any>destination).__serializableMembers) {
-                var propertyDescriptor = (<any>destination).__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[propertyDescriptor.sourceName || property];
                 var propertyType = propertyDescriptor.type;
 
@@ -195,10 +261,12 @@
             if (Tags) {
                 Tags.AddTagsTo(destination, (<any>source).tags);
             }
+            
+            var classStore = getMergedStore(destination);
 
             // Properties
-            for (var property in (<any>destination).__serializableMembers) {
-                var propertyDescriptor = (<any>destination).__serializableMembers[property];
+            for (var property in classStore) {
+                var propertyDescriptor = classStore[property];
                 var sourceProperty = source[property];
                 var propertyType = propertyDescriptor.type;
 

+ 1 - 1
src/Tools/babylon.tools.ts

@@ -1137,7 +1137,7 @@
          * @param object the object to get the class name from
          * @return the name of the class, will be "object" for a custom data type not using the @className decorator
          */
-        public static getClassName(object, isType: boolean = false): string {
+        public static GetClassName(object, isType: boolean = false): string {
             let name = null;
 
             if (!isType && object.getClassName) {