Pārlūkot izejas kodu

Merge remote-tracking branch 'upstream/master' into bone-fix

Gary Hsu 7 gadi atpakaļ
vecāks
revīzija
8a5e6fe669
57 mainītis faili ar 59739 papildinājumiem un 42963 dzēšanām
  1. 35789 20828
      Playground/babylon.d.txt
  2. 0 1
      Playground/debug.html
  3. 0 1
      Playground/frame.html
  4. 0 1
      Playground/full.html
  5. 0 1
      Playground/index.html
  6. 16508 15977
      dist/preview release/babylon.d.ts
  7. 53 53
      dist/preview release/babylon.js
  8. 964 430
      dist/preview release/babylon.max.js
  9. 964 430
      dist/preview release/babylon.no-module.max.js
  10. 54 54
      dist/preview release/babylon.worker.js
  11. 964 430
      dist/preview release/es6.js
  12. 3 3
      dist/preview release/gui/babylon.gui.min.js
  13. 4 4
      dist/preview release/inspector/babylon.inspector.bundle.js
  14. 3 3
      dist/preview release/inspector/babylon.inspector.min.js
  15. 2 2
      dist/preview release/loaders/babylon.glTF1FileLoader.min.js
  16. 8 8
      dist/preview release/loaders/babylon.glTF2FileLoader.js
  17. 2 2
      dist/preview release/loaders/babylon.glTF2FileLoader.min.js
  18. 8 8
      dist/preview release/loaders/babylon.glTFFileLoader.js
  19. 3 3
      dist/preview release/loaders/babylon.glTFFileLoader.min.js
  20. 1 1
      dist/preview release/loaders/babylon.objFileLoader.min.js
  21. 8 8
      dist/preview release/loaders/babylonjs.loaders.js
  22. 3 3
      dist/preview release/loaders/babylonjs.loaders.min.js
  23. 1 1
      dist/preview release/materialsLibrary/babylon.customMaterial.min.js
  24. 1 1
      dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js
  25. 1 1
      dist/preview release/materialsLibrary/babylon.waterMaterial.min.js
  26. 3 3
      dist/preview release/materialsLibrary/babylonjs.materials.min.js
  27. 1 1
      dist/preview release/postProcessesLibrary/babylon.asciiArtPostProcess.min.js
  28. 1 1
      dist/preview release/postProcessesLibrary/babylon.digitalRainPostProcess.min.js
  29. 1 1
      dist/preview release/postProcessesLibrary/babylonjs.postProcess.min.js
  30. 1 1
      dist/preview release/serializers/babylon.glTF2Serializer.min.js
  31. 1 1
      dist/preview release/serializers/babylonjs.serializers.min.js
  32. 2366 3797
      dist/preview release/typedocValidationBaseline.json
  33. 62 62
      dist/preview release/viewer/babylon.viewer.js
  34. 972 438
      dist/preview release/viewer/babylon.viewer.max.js
  35. 3 0
      dist/preview release/what's new.md
  36. 3 0
      src/Animations/babylon.animation.ts
  37. 3 3
      src/Cameras/babylon.camera.ts
  38. 11 4
      src/Engine/babylon.engine.ts
  39. 8 1
      src/Loading/Plugins/babylon.babylonFileLoader.ts
  40. 13 1
      src/Materials/Textures/babylon.mirrorTexture.ts
  41. 1 1
      src/Materials/Textures/babylon.renderTargetTexture.ts
  42. 13 0
      src/Materials/babylon.standardMaterial.ts
  43. 376 235
      src/Math/babylon.math.ts
  44. 6 6
      src/Mesh/babylon.buffer.ts
  45. 10 8
      src/Mesh/babylon.geometry.ts
  46. 308 57
      src/Mesh/babylon.mesh.vertexData.ts
  47. 6 3
      src/Mesh/babylon.vertexBuffer.ts
  48. 70 4
      src/Morph/babylon.morphTarget.ts
  49. 72 8
      src/Morph/babylon.morphTargetManager.ts
  50. 6 3
      src/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts
  51. 6 6
      src/PostProcess/babylon.bloomEffect.ts
  52. 7 7
      src/PostProcess/babylon.depthOfFieldEffect.ts
  53. 58 55
      src/Shaders/default.fragment.fx
  54. BIN
      tests/validation/ReferenceImages/texture cache.png
  55. 5 0
      tests/validation/config.json
  56. 2 1
      tests/validation/index.html
  57. 0 1
      tests/validation/validate.html

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 35789 - 20828
Playground/babylon.d.txt


+ 0 - 1
Playground/debug.html

@@ -80,7 +80,6 @@
     <script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.min.js"></script>
 
     <script src="https://rawgit.com/BabylonJS/Extensions/master/ClonerSystem/src/babylonx.cloner.js"></script>
-    <script src="https://rawgit.com/BabylonJS/Extensions/master/canvas2D/dist/preview%20release/babylon.canvas2d.js"></script>
     <script src="https://rawgit.com/BabylonJS/Extensions/master/CompoundShader/src/babylonx.CompoundShader.js"></script>
     <link href="css/index.css" rel="stylesheet" />
 

+ 0 - 1
Playground/frame.html

@@ -69,7 +69,6 @@
     <script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script>
 
     <script src="https://rawgit.com/BabylonJS/Extensions/master/ClonerSystem/src/babylonx.cloner.js"></script>
-    <script src="https://rawgit.com/BabylonJS/Extensions/master/canvas2D/dist/preview%20release/babylon.canvas2d.min.js"></script>
     <script src="https://rawgit.com/BabylonJS/Extensions/master/CompoundShader/src/babylonx.CompoundShader.js"></script>
     <link href="frame.css" rel="stylesheet" />
 </head>

+ 0 - 1
Playground/full.html

@@ -45,7 +45,6 @@
         <script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script>
 
         <script src="https://rawgit.com/BabylonJS/Extensions/master/ClonerSystem/src/babylonx.cloner.js"></script>
-        <script src="https://rawgit.com/BabylonJS/Extensions/master/canvas2D/dist/preview%20release/babylon.canvas2d.min.js"></script>
         <script src="https://rawgit.com/BabylonJS/Extensions/master/CompoundShader/src/babylonx.CompoundShader.js"></script>
         <link href="frame.css" rel="stylesheet" />
     </head>

+ 0 - 1
Playground/index.html

@@ -60,7 +60,6 @@
         <script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script>
 
         <script src="https://rawgit.com/BabylonJS/Extensions/master/ClonerSystem/src/babylonx.cloner.js"></script>
-        <script src="https://rawgit.com/BabylonJS/Extensions/master/canvas2D/dist/preview%20release/babylon.canvas2d.min.js"></script>
         <script src="https://rawgit.com/BabylonJS/Extensions/master/CompoundShader/src/babylonx.CompoundShader.js"></script>
         <link href="css/index.css" rel="stylesheet" />
     </head>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 16508 - 15977
dist/preview release/babylon.d.ts


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 53 - 53
dist/preview release/babylon.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 964 - 430
dist/preview release/babylon.max.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 964 - 430
dist/preview release/babylon.no-module.max.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 54 - 54
dist/preview release/babylon.worker.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 964 - 430
dist/preview release/es6.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 3
dist/preview release/gui/babylon.gui.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 4
dist/preview release/inspector/babylon.inspector.bundle.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 3
dist/preview release/inspector/babylon.inspector.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 2 - 2
dist/preview release/loaders/babylon.glTF1FileLoader.min.js


+ 8 - 8
dist/preview release/loaders/babylon.glTF2FileLoader.js

@@ -2189,7 +2189,7 @@ var BABYLON;
                     _this.name = NAME;
                     _this._dracoCompression = null;
                     // Disable extension if decoder is not available.
-                    if (!BABYLON.DracoCompression.DecoderUrl) {
+                    if (!BABYLON.DracoCompression.DecoderAvailable) {
                         _this.enabled = false;
                     }
                     return _this;
@@ -2234,8 +2234,8 @@ var BABYLON;
                         loadAttribute("WEIGHTS_0", BABYLON.VertexBuffer.MatricesWeightsKind);
                         loadAttribute("COLOR_0", BABYLON.VertexBuffer.ColorKind);
                         var bufferView = GLTF2.GLTFLoader._GetProperty(extensionContext, _this._loader._gltf.bufferViews, extension.bufferView);
-                        return _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
-                            try {
+                        if (!bufferView._dracoBabylonGeometry) {
+                            bufferView._dracoBabylonGeometry = _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
                                 if (!_this._dracoCompression) {
                                     _this._dracoCompression = new BABYLON.DracoCompression();
                                 }
@@ -2243,12 +2243,12 @@ var BABYLON;
                                     var babylonGeometry = new BABYLON.Geometry(babylonMesh.name, _this._loader._babylonScene);
                                     babylonVertexData.applyToGeometry(babylonGeometry);
                                     return babylonGeometry;
+                                }).catch(function (error) {
+                                    throw new Error(context + ": " + error.message);
                                 });
-                            }
-                            catch (e) {
-                                throw new Error(context + ": " + e.message);
-                            }
-                        });
+                            });
+                        }
+                        return bufferView._dracoBabylonGeometry;
                     });
                 };
                 return KHR_draco_mesh_compression;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 2 - 2
dist/preview release/loaders/babylon.glTF2FileLoader.min.js


+ 8 - 8
dist/preview release/loaders/babylon.glTFFileLoader.js

@@ -4387,7 +4387,7 @@ var BABYLON;
                     _this.name = NAME;
                     _this._dracoCompression = null;
                     // Disable extension if decoder is not available.
-                    if (!BABYLON.DracoCompression.DecoderUrl) {
+                    if (!BABYLON.DracoCompression.DecoderAvailable) {
                         _this.enabled = false;
                     }
                     return _this;
@@ -4432,8 +4432,8 @@ var BABYLON;
                         loadAttribute("WEIGHTS_0", BABYLON.VertexBuffer.MatricesWeightsKind);
                         loadAttribute("COLOR_0", BABYLON.VertexBuffer.ColorKind);
                         var bufferView = GLTF2.GLTFLoader._GetProperty(extensionContext, _this._loader._gltf.bufferViews, extension.bufferView);
-                        return _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
-                            try {
+                        if (!bufferView._dracoBabylonGeometry) {
+                            bufferView._dracoBabylonGeometry = _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
                                 if (!_this._dracoCompression) {
                                     _this._dracoCompression = new BABYLON.DracoCompression();
                                 }
@@ -4441,12 +4441,12 @@ var BABYLON;
                                     var babylonGeometry = new BABYLON.Geometry(babylonMesh.name, _this._loader._babylonScene);
                                     babylonVertexData.applyToGeometry(babylonGeometry);
                                     return babylonGeometry;
+                                }).catch(function (error) {
+                                    throw new Error(context + ": " + error.message);
                                 });
-                            }
-                            catch (e) {
-                                throw new Error(context + ": " + e.message);
-                            }
-                        });
+                            });
+                        }
+                        return bufferView._dracoBabylonGeometry;
                     });
                 };
                 return KHR_draco_mesh_compression;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 3
dist/preview release/loaders/babylon.glTFFileLoader.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/loaders/babylon.objFileLoader.min.js


+ 8 - 8
dist/preview release/loaders/babylonjs.loaders.js

@@ -5348,7 +5348,7 @@ var BABYLON;
                     _this.name = NAME;
                     _this._dracoCompression = null;
                     // Disable extension if decoder is not available.
-                    if (!BABYLON.DracoCompression.DecoderUrl) {
+                    if (!BABYLON.DracoCompression.DecoderAvailable) {
                         _this.enabled = false;
                     }
                     return _this;
@@ -5393,8 +5393,8 @@ var BABYLON;
                         loadAttribute("WEIGHTS_0", BABYLON.VertexBuffer.MatricesWeightsKind);
                         loadAttribute("COLOR_0", BABYLON.VertexBuffer.ColorKind);
                         var bufferView = GLTF2.GLTFLoader._GetProperty(extensionContext, _this._loader._gltf.bufferViews, extension.bufferView);
-                        return _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
-                            try {
+                        if (!bufferView._dracoBabylonGeometry) {
+                            bufferView._dracoBabylonGeometry = _this._loader._loadBufferViewAsync("#/bufferViews/" + bufferView._index, bufferView).then(function (data) {
                                 if (!_this._dracoCompression) {
                                     _this._dracoCompression = new BABYLON.DracoCompression();
                                 }
@@ -5402,12 +5402,12 @@ var BABYLON;
                                     var babylonGeometry = new BABYLON.Geometry(babylonMesh.name, _this._loader._babylonScene);
                                     babylonVertexData.applyToGeometry(babylonGeometry);
                                     return babylonGeometry;
+                                }).catch(function (error) {
+                                    throw new Error(context + ": " + error.message);
                                 });
-                            }
-                            catch (e) {
-                                throw new Error(context + ": " + e.message);
-                            }
-                        });
+                            });
+                        }
+                        return bufferView._dracoBabylonGeometry;
                     });
                 };
                 return KHR_draco_mesh_compression;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 3
dist/preview release/loaders/babylonjs.loaders.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/materialsLibrary/babylon.customMaterial.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/materialsLibrary/babylon.waterMaterial.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3 - 3
dist/preview release/materialsLibrary/babylonjs.materials.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/postProcessesLibrary/babylon.asciiArtPostProcess.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/postProcessesLibrary/babylon.digitalRainPostProcess.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/postProcessesLibrary/babylonjs.postProcess.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/serializers/babylon.glTF2Serializer.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 1
dist/preview release/serializers/babylonjs.serializers.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 2366 - 3797
dist/preview release/typedocValidationBaseline.json


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 62 - 62
dist/preview release/viewer/babylon.viewer.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 972 - 438
dist/preview release/viewer/babylon.viewer.max.js


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

@@ -133,6 +133,9 @@
 - Add onLoadObservable on VideoTexture - [#3845](https://github.com/BabylonJS/Babylon.js/issues/3845) ([sebavan](https://github.com/sebavan))
 - beforeRender is now triggered after the camera updated its state - [#3873](https://github.com/BabylonJS/Babylon.js/issues/3873) ([RaananW](https://github.com/RaananW))
 - Tools.DeepCopy no longer copying getter-only elements - [#3929](https://github.com/BabylonJS/Babylon.js/issues/3929) ([RaananW](https://github.com/RaananW))
+- Reflection and refraction no longer apply a toLinear conversion twice when applying image processing as a post process - [#4060](https://github.com/BabylonJS/Babylon.js/issues/4060) ([trevordev](https://github.com/trevordev))
+- Fix ember.js compatibility in ```PostProcessRenderEffect``` ([sebavan](https://github.com/sebavan))
+- Fix ember.js compatibility in ```BloomEffect``` and ```Camera``` ([kaysabelle](https://github.com/kaysabelle))
 
 ## Breaking changes
 

+ 3 - 0
src/Animations/babylon.animation.ts

@@ -96,6 +96,9 @@
         STEP = 1
     }
 
+    /**
+     * Class used to store any kind of animation
+     */
     export class Animation {
         /**
          * Use matrix interpolation instead of using direct key value when animating matrices

+ 3 - 3
src/Cameras/babylon.camera.ts

@@ -373,9 +373,9 @@
          * @returns the first post process to be run on this camera.
          */
         public _getFirstPostProcess():Nullable<PostProcess>{
-            for(var pp in this._postProcesses){
-                if(this._postProcesses[pp] !== null){
-                    return this._postProcesses[pp];
+            for(var ppIndex = 0; ppIndex < this._postProcesses.length; ppIndex++){
+                if(this._postProcesses[ppIndex] !== null){
+                    return this._postProcesses[ppIndex];
                 }
             }
             return null;

+ 11 - 4
src/Engine/babylon.engine.ts

@@ -6397,18 +6397,21 @@
                 channel = this._getCorrectTextureChannel(channel, internalTexture);
             }
 
+            let needToBind = true;
             if (this._boundTexturesCache[channel] === internalTexture) {
                 this._moveBoundTextureOnTop(internalTexture);
                 if (!isPartOfTextureArray) {
                     this._bindSamplerUniformToChannel(internalTexture._initialSlot, channel);
                 }
-                return false;
+                needToBind = false;
             }
 
             this._activeChannel = channel;
 
             if (internalTexture && internalTexture.is3D) {
-                this._bindTextureDirectly(this._gl.TEXTURE_3D, internalTexture, isPartOfTextureArray);
+                if (needToBind) {
+                    this._bindTextureDirectly(this._gl.TEXTURE_3D, internalTexture, isPartOfTextureArray);
+                }
 
                 if (internalTexture && internalTexture._cachedWrapU !== texture.wrapU) {
                     internalTexture._cachedWrapU = texture.wrapU;
@@ -6459,7 +6462,9 @@
                 this._setAnisotropicLevel(this._gl.TEXTURE_3D, texture);
             }
             else if (internalTexture && internalTexture.isCube) {
-                this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, internalTexture, isPartOfTextureArray);
+                if (needToBind) {
+                    this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, internalTexture, isPartOfTextureArray);
+                }
 
                 if (internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) {
                     internalTexture._cachedCoordinatesMode = texture.coordinatesMode;
@@ -6471,7 +6476,9 @@
 
                 this._setAnisotropicLevel(this._gl.TEXTURE_CUBE_MAP, texture);
             } else {
-                this._bindTextureDirectly(this._gl.TEXTURE_2D, internalTexture, isPartOfTextureArray);
+                if (needToBind) {               
+                    this._bindTextureDirectly(this._gl.TEXTURE_2D, internalTexture, isPartOfTextureArray);
+                }
 
                 if (internalTexture && internalTexture._cachedWrapU !== texture.wrapU) {
                     internalTexture._cachedWrapU = texture.wrapU;

+ 8 - 1
src/Loading/Plugins/babylon.babylonFileLoader.ts

@@ -534,9 +534,16 @@
                                 }
                             }
 
+                            // Morph targets ?
+                            if (parsedData.morphTargetManagers !== undefined && parsedData.morphTargetManagers !== null) {
+                                for (var managerData of parsedData.morphTargetManagers) {
+                                    MorphTargetManager.Parse(managerData, scene);
+                                }
+                            }                               
+
                             var mesh = Mesh.Parse(parsedMesh, scene, rootUrl);
                             meshes.push(mesh);
-                            log += "\n\tMesh " + mesh.toString(fullDetails);
+                            log += "\n\tMesh " + mesh.toString(fullDetails);                         
                         }
                     }
 

+ 13 - 1
src/Materials/Textures/babylon.mirrorTexture.ts

@@ -83,11 +83,18 @@
                 this._autoComputeBlurKernel();
             }
         }
+        private _updateGammaSpace(){
+            this.gammaSpace = !this.scene.imageProcessingConfiguration.isEnabled || !this.scene.imageProcessingConfiguration.applyByPostProcess;
+        }
 
-        constructor(name: string, size: number | { width: number, height: number } | { ratio: number }, scene: Scene, generateMipMaps?: boolean, type: number = Engine.TEXTURETYPE_UNSIGNED_INT, samplingMode = Texture.BILINEAR_SAMPLINGMODE, generateDepthBuffer = true) {
+        private _imageProcessingConfigChangeObserver:Nullable<Observer<ImageProcessingConfiguration>>;
+        constructor(name: string, size: number | { width: number, height: number } | { ratio: number }, private scene: Scene, generateMipMaps?: boolean, type: number = Engine.TEXTURETYPE_UNSIGNED_INT, samplingMode = Texture.BILINEAR_SAMPLINGMODE, generateDepthBuffer = true) {
             super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);
 
             this.ignoreCameraViewport = true;
+            
+            this._updateGammaSpace();
+            this._imageProcessingConfigChangeObserver = scene.imageProcessingConfiguration.onUpdateParameters.add(this._updateGammaSpace)
 
             this.onBeforeRenderObservable.add(() => {
                 Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);
@@ -193,5 +200,10 @@
 
             return serializationObject;
         }
+
+        public dispose(){
+            super.dispose();
+            this.scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);
+        }
     }
 } 

+ 1 - 1
src/Materials/Textures/babylon.renderTargetTexture.ts

@@ -675,7 +675,7 @@
             var textureSize = this.getSize();
             var newTexture = new RenderTargetTexture(
                 this.name,
-                textureSize.width,
+                textureSize,
                 this.getScene(),
                 this._renderTargetOptions.generateMipMaps,
                 this._doNotChangeAspectRatio,

+ 13 - 0
src/Materials/babylon.standardMaterial.ts

@@ -87,6 +87,16 @@ module BABYLON {
         public SAMPLER3DGREENDEPTH = false;
         public SAMPLER3DBGRMAP = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
+        /**
+         * If the reflection texture on this material is in linear color space
+         * @ignore
+         */
+        public IS_REFLECTION_LINEAR = false;
+        /**
+         * If the refraction texture on this material is in linear color space
+         * @ignore
+         */
+        public IS_REFRACTION_LINEAR = false;
         public EXPOSURE = false;
 
         constructor() {
@@ -724,6 +734,9 @@ module BABYLON {
                 }
 
                 this._imageProcessingConfiguration.prepareDefines(defines);
+
+                defines.IS_REFLECTION_LINEAR = (this.reflectionTexture != null && !this.reflectionTexture.gammaSpace);
+                defines.IS_REFRACTION_LINEAR = (this.refractionTexture != null && !this.refractionTexture.gammaSpace);
             }
 
             if (defines._areFresnelDirty) {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 376 - 235
src/Math/babylon.math.ts


+ 6 - 6
src/Mesh/babylon.buffer.ts

@@ -34,7 +34,7 @@
 
             this._data = data;
 
-            this.byteStride = useBytes ? stride : stride * 4;
+            this.byteStride = useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT;
 
             if (!postponeInternalCreation) { // by default
                 this.create();
@@ -52,8 +52,8 @@
          * @returns the new vertex buffer
          */
         public createVertexBuffer(kind: string, offset: number, size: number, stride?: number, instanced?: boolean, useBytes = false): VertexBuffer {
-            const byteOffset = useBytes ? offset : offset * 4;
-            const byteStride = stride ? (useBytes ? stride : stride * 4) : this.byteStride;
+            const byteOffset = useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT;
+            const byteStride = stride ? (useBytes ? stride : stride * Float32Array.BYTES_PER_ELEMENT) : this.byteStride;
 
             // a lot of these parameters are ignored as they are overriden by the buffer
             return new VertexBuffer(this._engine, this, kind, this._updatable, true, byteStride, instanced === undefined ? this._instanced : instanced, byteOffset, size, undefined, undefined, true);
@@ -79,7 +79,7 @@
          * @returns the stride in float32 units
          */
         public getStrideSize(): number {
-            return this.byteStride / 4;
+            return this.byteStride / Float32Array.BYTES_PER_ELEMENT;
         }
 
         // Methods
@@ -123,13 +123,13 @@
          * @param vertexCount the vertex count (optional)
          * @param useBytes set to true if the offset is in bytes
          */
-        public updateDirectly(data: DataArray, offset: number, vertexCount?: number, useBytes = false): void {
+        public updateDirectly(data: DataArray, offset: number, vertexCount?: number, useBytes: boolean = false): void {
             if (!this._buffer) {
                 return;
             }
 
             if (this._updatable) { // update buffer
-                this._engine.updateDynamicVertexBuffer(this._buffer, data, useBytes ? offset : offset * 4, (vertexCount ? vertexCount * this.byteStride : undefined));
+                this._engine.updateDynamicVertexBuffer(this._buffer, data, useBytes ? offset : offset * Float32Array.BYTES_PER_ELEMENT, (vertexCount ? vertexCount * this.byteStride : undefined));
                 this._data = null;
             }
         }

+ 10 - 8
src/Mesh/babylon.geometry.ts

@@ -204,10 +204,6 @@
          * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified
          */
         public setVerticesData(kind: string, data: FloatArray, updatable: boolean = false, stride?: number): void {
-            if (kind === VertexBuffer.PositionKind) {
-                this._totalVertices = data.length / (stride || 3);
-            }
-
             var buffer = new VertexBuffer(this._engine, data, kind, updatable, this._meshes.length === 0, stride);
             this.setVerticesBuffer(buffer);
         }
@@ -236,12 +232,17 @@
 
             this._vertexBuffers[kind] = buffer;
 
-            if (kind === VertexBuffer.PositionKind) {
+            if (kind === VertexBuffer.PositionKind) {                
+                var data = <FloatArray>buffer.getData();
                 if (totalVertices != null) {
                     this._totalVertices = totalVertices;
+                } else {
+                    if (data != null) {
+                        this._totalVertices = data.length / (buffer.byteStride / 4);
+                    }
                 }
 
-                this._updateExtend();
+                this._updateExtend(data);
                 this._resetPointsArrayCache();
 
                 var meshes = this._meshes;
@@ -270,15 +271,16 @@
          * @param kind defines the data kind (Position, normal, etc...)
          * @param data defines the data to use 
          * @param offset defines the offset in the target buffer where to store the data
+         * @param useBytes set to true if the offset is in bytes
          */
-        public updateVerticesDataDirectly(kind: string, data: Float32Array, offset: number): void {
+        public updateVerticesDataDirectly(kind: string, data: DataArray, offset: number, useBytes: boolean = false): void {
             var vertexBuffer = this.getVertexBuffer(kind);
 
             if (!vertexBuffer) {
                 return;
             }
 
-            vertexBuffer.updateDirectly(data, offset);
+            vertexBuffer.updateDirectly(data, offset, useBytes);
             this.notifyUpdate(kind);
         }
 

+ 308 - 57
src/Mesh/babylon.mesh.vertexData.ts

@@ -1,4 +1,7 @@
 module BABYLON {
+    /**
+     * Define an interface for all classes that will get and set the data on vertices
+     */
     export interface IGetSetVerticesData {
         isVerticesDataPresent(kind: string): boolean;
         getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray>;
@@ -8,23 +11,91 @@
         setIndices(indices: IndicesArray, totalVertices: Nullable<number>, updatable?: boolean): void;
     }
 
+    /**
+     * This class contains the various kinds of data on every vertex of a mesh used in determining its shape and appearance 
+     */
     export class VertexData {
+        
+        /**
+         * An array of the x, y, z position of each vertex  [...., x, y, z, .....]
+         */
         public positions: Nullable<FloatArray>;
+        
+        /**
+         * An array of the x, y, z normal vector of each vertex  [...., x, y, z, .....]
+         */
         public normals: Nullable<FloatArray>;
+        
+        /**
+         * An array of the x, y, z tangent vector of each vertex  [...., x, y, z, .....]
+         */
         public tangents: Nullable<FloatArray>;
+        
+        /**
+         * An array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs: Nullable<FloatArray>;
+        
+        /**
+         * A second array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs2: Nullable<FloatArray>;
+        
+        /**
+         * A third array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs3: Nullable<FloatArray>;
+        
+        /**
+         * A fourth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs4: Nullable<FloatArray>;
+        
+        /**
+         * A fifth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs5: Nullable<FloatArray>;
+        
+        /**
+         * A sixth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
+         */
         public uvs6: Nullable<FloatArray>;
+        
+        /**
+         * An array of the r, g, b, a, color of each vertex  [...., r, g, b, a, .....]
+         */
         public colors: Nullable<FloatArray>;
+
+        /**
+         * An array containing the list of indices to the array of matrices produced by bones, each vertex have up to 4 indices (8 if the matricesIndicesExtra is set).
+         */
         public matricesIndices: Nullable<FloatArray>;
+
+        /**
+         * An array containing the list of weights defining the weight of each indexed matrix in the final computation
+         */
         public matricesWeights: Nullable<FloatArray>;
+
+        /**
+         * An array extending the number of possible indices
+         */
         public matricesIndicesExtra: Nullable<FloatArray>;
+
+        /**
+         * An array extending the number of possible weights when the number of indices is extended
+         */
         public matricesWeightsExtra: Nullable<FloatArray>;
+        
+        /**
+         * An array of i, j, k the three vertex indices required for each triangular facet  [...., i, j, k .....]
+         */
         public indices: Nullable<IndicesArray>;
 
+        /**
+         * Uses the passed data array to set the set the values for the specified kind of data
+         * @param data a linear array of floating numbers
+         * @param kind the type of data that is being set, eg positions, colors etc
+         */
         public set(data: FloatArray, kind: string) {
             switch (kind) {
                 case VertexBuffer.PositionKind:
@@ -73,9 +144,11 @@
         }
 
         /**
-         * Associates the vertexData to the passed Mesh.  
-         * Sets it as updatable or not (default `false`).  
-         * Returns the VertexData.  
+         * Associates the vertexData to the passed Mesh.
+         * Sets it as updatable or not (default `false`) 
+         * @param mesh the mesh the vertexData is applied to 
+         * @param updatable when used and having the value true allows new data to update the vertexData 
+         * @returns the VertexData 
          */
         public applyToMesh(mesh: Mesh, updatable?: boolean): VertexData {
             this._applyTo(mesh, updatable);
@@ -83,9 +156,11 @@
         }
 
         /**
-         * Associates the vertexData to the passed Geometry.  
-         * Sets it as updatable or not (default `false`).  
-         * Returns the VertexData.  
+         * Associates the vertexData to the passed Geometry.
+         * Sets it as updatable or not (default `false`)
+         * @param geometry the geometry the vertexData is applied to 
+         * @param updatable when used and having the value true allows new data to update the vertexData 
+         * @returns VertexData
          */
         public applyToGeometry(geometry: Geometry, updatable?: boolean): VertexData {
             this._applyTo(geometry, updatable);
@@ -93,8 +168,11 @@
         }
 
         /**
-         * Updates the associated mesh.  
-         * Returns the VertexData.  
+         * Updates the associated mesh
+         * @param mesh the mesh to be updated
+         * @param updateExtends when true the mesh BoundingInfo will be renewed when and if position kind is updated, optional with default false
+         * @param makeItUnique when true, and when and if position kind is updated, a new global geometry will be  created from these positions and set to the mesh, optional with default false 
+         * @returns VertexData
          */
         public updateMesh(mesh: Mesh, updateExtends?: boolean, makeItUnique?: boolean): VertexData {
             this._update(mesh);
@@ -102,8 +180,11 @@
         }
 
         /**
-         * Updates the associated geometry.  
-         * Returns the VertexData.  
+         * Updates the associated geometry 
+         * @param geometry the geometry to be updated
+         * @param updateExtends when true BoundingInfo will be renewed when and if position kind is updated, optional with default false
+         * @param makeItUnique when true, and when and if position kind is updated, a new global geometry will be created from these positions and set to the mesh, optional with default false 
+         * @returns VertexData.
          */
         public updateGeometry(geometry: Geometry, updateExtends?: boolean, makeItUnique?: boolean): VertexData {
             this._update(geometry);
@@ -237,8 +318,9 @@
         }
 
         /**
-         * Transforms each position and each normal of the vertexData according to the passed Matrix.  
-         * Returns the VertexData.  
+         * Transforms each position and each normal of the vertexData according to the passed Matrix
+         * @param matrix the transforming matrix
+         * @returns the VertexData 
          */
         public transform(matrix: Matrix): VertexData {
             var transformed = Vector3.Zero();
@@ -288,8 +370,9 @@
         }
 
         /**
-         * Merges the passed VertexData into the current one.  
-         * Returns the modified VertexData.  
+         * Merges the passed VertexData into the current one
+         * @param other the VertexData to be merged into the current one  
+         * @returns the modified VertexData 
          */
         public merge(other: VertexData): VertexData {
             this._validate();
@@ -414,8 +497,8 @@
         }
 
         /**
-         * Serializes the VertexData.  
-         * Returns a serialized object.  
+         * Serializes the VertexData  
+         * @returns a serialized object 
          */
         public serialize(): any {
             var serializationObject = this.serialize();
@@ -485,14 +568,22 @@
 
         // Statics
         /**
-         * Returns the object VertexData associated to the passed mesh.  
+         * Extracts the vertexData from a mesh
+         * @param mesh the mesh from which to extract the VertexData
+         * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false
+         * @param forceCopy indicating that the VertexData must be cloned, optional, default false
+         * @returns the object VertexData associated to the passed mesh 
          */
         public static ExtractFromMesh(mesh: Mesh, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {
             return VertexData._ExtractFrom(mesh, copyWhenShared, forceCopy);
         }
 
         /**
-         * Returns the object VertexData associated to the passed geometry.  
+         * Extracts the vertexData from the geometry
+         * @param geometry the geometry from which to extract the VertexData
+         * @param copyWhenShared defines if the VertexData must be cloned when the geometrty is shared between multiple meshes, optional, default false
+         * @param forceCopy indicating that the VertexData must be cloned, optional, default false
+         * @returns the object VertexData associated to the passed mesh 
          */
         public static ExtractFromGeometry(geometry: Geometry, copyWhenShared?: boolean, forceCopy?: boolean): VertexData {
             return VertexData._ExtractFrom(geometry, copyWhenShared, forceCopy);
@@ -563,7 +654,19 @@
         }
 
         /**
-         * Creates the vertexData of the Ribbon.  
+         * Creates the VertexData for a Ribbon
+         * @param options an object used to set the following optional parameters for the ribbon, required but can be empty 
+          * * pathArray array of paths, each of which an array of successive Vector3    
+          * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false  
+          * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false
+          * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
+          * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false
+          * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional
+          * * colors a linear array, of length 4 * number of vertices, of custom color values, optional
+         * @returns the VertexData of the ribbon
          */
         public static CreateRibbon(options: { pathArray: Vector3[][], closeArray?: boolean, closePath?: boolean, offset?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4, invertUV?: boolean, uvs?: Vector2[], colors?: Color4[] }): VertexData {
             var pathArray: Vector3[][] = options.pathArray;
@@ -797,8 +900,19 @@
         }
 
         /**
-         * Creates the VertexData of the Box.  
-         */
+         * Creates the VertexData for a box
+         * @param options an object used to set the following optional parameters for the box, required but can be empty 
+          * * size sets the width, height and depth of the box to the value of size, optional default 1  
+          * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size
+          * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size
+          * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size
+          * * faceUV an array of 6 Vector4 elements used to set different images to each box side
+          * * faceColors an array of 6 Color3 elements used to set different colors to each box side   
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the box
+         */ 
         public static CreateBox(options: { size?: number, width?: number, height?: number, depth?: number, faceUV?: Vector4[], faceColors?: Color4[], sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var normalsSource = [
                 new Vector3(0, 0, 1),
@@ -906,8 +1020,20 @@
         }
 
         /**
-         * Creates the VertexData of the Sphere.  
-         */
+         * Creates the VertexData for an ellipsoid, defaults to a sphere
+         * @param options an object used to set the following optional parameters for the box, required but can be empty 
+          * * segments sets the number of horizontal strips optional, default 32
+          * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1  
+          * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter
+          * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter
+          * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter
+          * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1 
+          * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1   
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the ellipsoid
+         */         
         public static CreateSphere(options: { segments?: number, diameter?: number, diameterX?: number, diameterY?: number, diameterZ?: number, arc?: number, slice?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var segments: number = options.segments || 32;
             var diameterX: number = options.diameterX || options.diameter || 1;
@@ -978,8 +1104,24 @@
         }
 
         /**
-         * Creates the VertexData of the Cylinder or Cone.  
-         */
+         * Creates the VertexData for a cylinder, cone or prism
+         * @param options an object used to set the following optional parameters for the box, required but can be empty 
+          * * height sets the height (y direction) of the cylinder, optional, default 2  
+          * * diameterTop sets the diameter of the top of the cone, overwrites diameter,  optional, default diameter
+          * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter,  optional, default diameter
+          * * diameter sets the diameter of the top and bottom of the cone, optional default 1
+          * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
+          * * subdivisions` the number of rings along the cylinder height, optional, default 1
+          * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1
+          * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
+          * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
+          * * hasRings when true makes each subdivision independantly treated as a face for faceUV and faceColors, optional, default false
+          * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the cylinder, cone or prism
+         */         
         public static CreateCylinder(options: { height?: number, diameterTop?: number, diameterBottom?: number, diameter?: number, tessellation?: number, subdivisions?: number, arc?: number, faceColors?: Color4[], faceUV?: Vector4[], hasRings?: boolean, enclose?: boolean, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var height: number = options.height || 2;
             var diameterTop: number = (options.diameterTop === 0) ? 0 : options.diameterTop || options.diameter || 1;
@@ -1232,8 +1374,16 @@
         }
 
         /**
-         * Creates the VertexData of the Torus.  
-         */
+         * Creates the VertexData for a torus
+         * @param options an object used to set the following optional parameters for the box, required but can be empty 
+          * * diameter the diameter of the torus, optional default 1
+          * * thickness the diameter of the tube forming the torus, optional default 0.5
+          * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the torus
+         */ 
         public static CreateTorus(options: { diameter?: number, thickness?: number, tessellation?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }) {
             var indices = [];
             var positions = [];
@@ -1303,7 +1453,11 @@
         }
 
         /**
-         * Creates the VertexData of the LineSystem.  
+         * Creates the VertexData of the LineSystem
+         * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty
+         *  - lines an array of lines, each line being an array of successive Vector3
+         *  - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point
+         * @returns the VertexData of the LineSystem 
          */
         public static CreateLineSystem(options: { lines: Vector3[][], colors?: Nullable<Color4[][]> }): VertexData {
             var indices = [];
@@ -1338,7 +1492,13 @@
         }
 
         /**
-         * Create the VertexData of the DashedLines.  
+         * Create the VertexData for a DashedLines
+         * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty
+         *  - points an array successive Vector3
+         *  - dashSize the size of the dashes relative to the dash number, optional, default 3
+         *  - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1
+         *  - dashNb the intended total number of dashes, optional, default 200
+         * @returns the VertexData for the DashedLines  
          */
         public static CreateDashedLines(options: { points: Vector3[], dashSize?: number, gapSize?: number, dashNb?: number }): VertexData {
             var dashSize = options.dashSize || 3;
@@ -1385,7 +1545,12 @@
         }
 
         /**
-         * Creates the VertexData of the Ground.  
+         * Creates the VertexData for a Ground
+         * @param options an object used to set the following optional parameters for the Ground, required but can be empty
+         *  - width the width (x direction) of the ground, optional, default 1
+         *  - height the height (z direction) of the ground, optional, default 1
+         *  - subdivisions the number of subdivisions per side, optional, default 1
+         * @returns the VertexData of the Ground  
          */
         public static CreateGround(options: { width?: number, height?: number, subdivisions?: number, subdivisionsX?: number, subdivisionsY?: number }): VertexData {
             var indices = [];
@@ -1434,7 +1599,15 @@
         }
 
         /**
-         * Creates the VertexData of the TiledGround.  
+         * Creates the VertexData for a TiledGround by subdividing the ground into tiles
+         * @param options an object used to set the following optional parameters for the Ground, required but can be empty
+          * * xmin the ground minimum X coordinate, optional, default -1
+          * * zmin the ground minimum Z coordinate, optional, default -1
+          * * xmax the ground maximum X coordinate, optional, default 1
+          * * zmax the ground maximum Z coordinate, optional, default 1
+          * * subdivisions a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default {w: 6, h: 6}
+          * * precision a javascript object {w: positive integer, h: positive integer}, `w` and `h` are the numbers of subdivisions on the tile width and height, default {w: 2, h: 2}
+         * @returns the VertexData of the TiledGround  
          */
         public static CreateTiledGround(options: { xmin: number, zmin: number, xmax: number, zmax: number, subdivisions?: { w: number; h: number; }, precision?: { w: number; h: number; } }): VertexData {
             var xmin = (options.xmin !== undefined && options.xmin !== null) ? options.xmin : -1.0;
@@ -1521,7 +1694,18 @@
         }
 
         /**
-         * Creates the VertexData of the Ground designed from a heightmap.  
+         * Creates the VertexData of the Ground designed from a heightmap
+         * @param options an object used to set the following parameters for the Ground, required and provided by MeshBuilder.CreateGroundFromHeightMap
+          * * width the width (x direction) of the ground
+          * * height the height (z direction) of the ground
+          * * subdivisions the number of subdivisions per side
+          * * minHeight the minimum altitude on the ground, optional, default 0
+          * * maxHeight the maximum altitude on the ground, optional default 1
+          * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)
+          * * buffer the array holding the image color data 
+          * * bufferWidth the width of image
+          * * bufferHeight the height of image
+         * @returns the VertexData of the Ground designed from a heightmap   
          */
         public static CreateGroundFromHeightMap(options: { width: number, height: number, subdivisions: number, minHeight: number, maxHeight: number, colorFilter: Color3, buffer: Uint8Array, bufferWidth: number, bufferHeight: number }): VertexData {
             var indices = [];
@@ -1584,8 +1768,16 @@
         }
 
         /**
-         * Creates the VertexData of the Plane.  
-         */
+         * Creates the VertexData for a Plane
+         * @param options an object used to set the following optional parameters for the plane, required but can be empty 
+          * * size sets the width and height of the plane to the value of size, optional default 1  
+          * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size
+          * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size  
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the box
+         */  
         public static CreatePlane(options: { size?: number, width?: number, height?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var indices = [];
             var positions = [];
@@ -1640,8 +1832,16 @@
         }
 
         /**
-         * Creates the VertexData of the Disc or regular Polygon.  
-         */
+         * Creates the VertexData of the Disc or regular Polygon
+         * @param options an object used to set the following optional parameters for the disc, required but can be empty 
+          * * radius the radius of the disc, optional default 0.5  
+          * * tessellation the number of polygon sides, optional, default 64
+          * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1 
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the box
+         */ 
         public static CreateDisc(options: { radius?: number, tessellation?: number, arc?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var positions = new Array<number>();
             var indices = new Array<number>();
@@ -1693,7 +1893,15 @@
         }
 
         /**
-         * Re-creates the VertexData of the Polygon for sideOrientation.  
+         * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()
+         * All parameters are provided by MeshBuilder.CreatePolygon as needed
+         * @param polygon a mesh built from polygonTriangulation.build()
+         * @param sideOrientation takes the values BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
+         * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
+         * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
+         * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+         * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
+         * @returns the VertexData of the Polygon
          */
         public static CreatePolygon(polygon: Mesh, sideOrientation: number, fUV?: Vector4[], fColors?: Color4[], frontUVs?: Vector4, backUVs?: Vector4) {
             var faceUV: Vector4[] = fUV || new Array<Vector4>(3);
@@ -1759,8 +1967,19 @@
         }
 
         /**
-         * Creates the VertexData of the IcoSphere.  
-         */
+         * Creates the VertexData of the IcoSphere
+         * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty 
+          * * radius the radius of the IcoSphere, optional default 1  
+          * * radiusX allows stretching in the x direction, optional, default radius
+          * * radiusY allows stretching in the y direction, optional, default radius
+          * * radiusZ allows stretching in the z direction, optional, default radius
+          * * flat when true creates a flat shaded mesh, optional, default true
+          * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the IcoSphere
+         */ 
         public static CreateIcoSphere(options: { radius?: number, radiusX?: number, radiusY?: number, radiusZ?: number, flat?: boolean, subdivisions?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var sideOrientation = options.sideOrientation || Mesh.DEFAULTSIDE;
             var radius = options.radius || 1;
@@ -2023,7 +2242,24 @@
 
         // inspired from // http://stemkoski.github.io/Three.js/Polyhedra.html
         /**
-         * Creates the VertexData of the Polyhedron.  
+         * Creates the VertexData for a Polyhedron
+         * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty 
+         * * type provided types are:
+         *  * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)
+         *  * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)
+         * * size the size of the IcoSphere, optional default 1  
+         * * sizeX allows stretching in the x direction, optional, default size
+         * * sizeY allows stretching in the y direction, optional, default size
+         * * sizeZ allows stretching in the z direction, optional, default size
+         * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor
+         * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
+         * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
+         * * flat when true creates a flat shaded mesh, optional, default true
+         * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4 
+         * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the Polyhedron 
          */
         public static CreatePolyhedron(options: { type?: number, size?: number, sizeX?: number, sizeY?: number, sizeZ?: number, custom?: any, faceUV?: Vector4[], faceColors?: Color4[], flat?: boolean, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             // provided polyhedron types :
@@ -2158,7 +2394,18 @@
 
         // based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473
         /**
-         * Creates the VertexData of the Torus Knot.  
+         * Creates the VertexData for a TorusKnot
+         * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty
+          * * radius the radius of the torus knot, optional, default 2
+          * * tube the thickness of the tube, optional, default 0.5 
+          * * radialSegments the number of sides on each tube segments, optional, default 32
+          * * tubularSegments the number of tubes to decompose the knot into, optional, default 32
+          * * p the number of windings around the z axis, optional,  default 2
+          * * q the number of windings around the x axis, optional,  default 3
+          * * sideOrientation optional and takes the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE     
+          * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
+          * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1) 
+         * @returns the VertexData of the Torus Knot
          */
         public static CreateTorusKnot(options: { radius?: number, tube?: number, radialSegments?: number, tubularSegments?: number, p?: number, q?: number, sideOrientation?: number, frontUVs?: Vector4, backUVs?: Vector4 }): VertexData {
             var indices = new Array<number>();
@@ -2252,22 +2499,24 @@
         }
 
         // Tools
+
         /**
-         * @param {any} - positions (number[] or Float32Array)
-         * @param {any} - indices   (number[] or Uint16Array)
-         * @param {any} - normals   (number[] or Float32Array)
-         * options (optional) :
-         * facetPositions : optional array of facet positions (vector3)
-         * facetNormals : optional array of facet normals (vector3)
-         * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation
-         * subDiv : optional partitioning data about subdivsions on  each axis (int), required for facetPartitioning computation
-         * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation
-         * bbSize : optional bounding box size data, required for facetPartitioning computation
-         * bInfo : optional bounding info, required for facetPartitioning computation
-         * useRightHandedSystem: optional boolean to for right handed system computation
-         * depthSort : optional boolean to enable the facet depth sort computation
-         * distanceTo : optional Vector3 to compute the facet depth from this location
-         * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location
+         * Compute normals for given positions and indices
+         * @param positions an array of vertex positions, [...., x, y, z, ......]
+         * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]
+         * @param normals an array of vertex normals, [...., x, y, z, ......]
+         * @param options an object used to set the following optional parameters for the TorusKnot, optional
+          * * facetNormals : optional array of facet normals (vector3)
+          * * facetPositions : optional array of facet positions (vector3)
+          * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation
+          * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation
+          * * bInfo : optional bounding info, required for facetPartitioning computation
+          * * bbSize : optional bounding box size data, required for facetPartitioning computation
+          * * subDiv : optional partitioning data about subdivsions on  each axis (int), required for facetPartitioning computation
+          * * useRightHandedSystem: optional boolean to for right handed system computation
+          * * depthSort : optional boolean to enable the facet depth sort computation
+          * * distanceTo : optional Vector3 to compute the facet depth from this location
+          * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location
          */
         public static ComputeNormals(positions: any, indices: any, normals: any,
             options?: {
@@ -2543,7 +2792,9 @@
         }
 
         /**
-         * Creates a new VertexData from the imported parameters.  
+         * Applies VertexData created from the imported parameters to the geometry
+         * @param parsedVertexData the parsed data from an imported file
+         * @param geometry the geometry to apply the VertexData to
          */
         public static ImportVertexData(parsedVertexData: any, geometry: Geometry) {
             var vertexData = new VertexData();

+ 6 - 3
src/Mesh/babylon.vertexBuffer.ts

@@ -232,10 +232,13 @@
 
         /**
          * Updates directly the underlying WebGLBuffer according to the passed numeric array or Float32Array.  
-         * Returns the directly updated WebGLBuffer. 
+         * Returns the directly updated WebGLBuffer.
+         * @param data the new data
+         * @param offset the new offset
+         * @param useBytes set to true if the offset is in bytes
          */
-        public updateDirectly(data: DataArray, offset: number): void {
-            return this._buffer.updateDirectly(data, offset);
+        public updateDirectly(data: DataArray, offset: number, useBytes: boolean = false): void {
+            this._buffer.updateDirectly(data, offset, undefined, useBytes);
         }
 
         /** 

+ 70 - 4
src/Morph/babylon.morphTarget.ts

@@ -1,5 +1,12 @@
 module BABYLON {
-    export class MorphTarget {
+    /**
+     * Defines a target to use with MorphTargetManager
+     * @see http://doc.babylonjs.com/how_to/how_to_use_morphtargets
+     */
+    export class MorphTarget implements IAnimatable {
+        /**
+         * Gets or sets the list of animations
+         */
         public animations = new Array<Animation>();
 
         private _positions: Nullable<FloatArray> = null;
@@ -7,8 +14,14 @@ module BABYLON {
         private _tangents: Nullable<FloatArray> = null;
         private _influence: number;
 
+        /**
+         * Observable raised when the influence changes
+         */
         public onInfluenceChanged = new Observable<boolean>();
 
+        /**
+         * Gets or sets the influence of this target (ie. its weight in the overall morphing)
+         */
         public get influence(): number {
             return this._influence;
         }
@@ -26,49 +39,89 @@ module BABYLON {
             }
         }
 
-        public constructor(public name: string, influence = 0) {
+        /**
+         * Creates a new MorphTarget
+         * @param name defines the name of the target
+         * @param influence defines the influence to use
+         */
+        public constructor(
+            /** defines the name of the target */
+            public name: string, influence = 0) {
             this.influence = influence;
         }
 
+        /**
+         * Gets a boolean defining if the target contains position data
+         */
         public get hasPositions(): boolean {
             return !!this._positions;
         }
 
+        /**
+         * Gets a boolean defining if the target contains normal data
+         */
         public get hasNormals(): boolean {
             return !!this._normals;
         }
 
+        /**
+         * Gets a boolean defining if the target contains tangent data
+         */        
         public get hasTangents(): boolean {
             return !!this._tangents;
         }
 
+        /**
+         * Affects position data to this target
+         * @param data defines the position data to use
+         */
         public setPositions(data: Nullable<FloatArray>) {
             this._positions = data;
         }
 
+        /**
+         * Gets the position data stored in this target
+         * @returns a FloatArray containing the position data (or null if not present)
+         */
         public getPositions(): Nullable<FloatArray> {
             return this._positions;
         }
 
+        /**
+         * Affects normal data to this target
+         * @param data defines the normal data to use
+         */        
         public setNormals(data: Nullable<FloatArray>) {
             this._normals = data;
         }
 
+        /**
+         * Gets the normal data stored in this target
+         * @returns a FloatArray containing the normal data (or null if not present)
+         */        
         public getNormals(): Nullable<FloatArray> {
             return this._normals;
         }
 
+        /**
+         * Affects tangent data to this target
+         * @param data defines the tangent data to use
+         */        
         public setTangents(data: Nullable<FloatArray>) {
             this._tangents = data;
         }
 
+        /**
+         * Gets the tangent data stored in this target
+         * @returns a FloatArray containing the tangent data (or null if not present)
+         */   
         public getTangents(): Nullable<FloatArray> {
             return this._tangents;
         }
 
         /**
-         * Serializes the current target into a Serialization object.  
-         * Returns the serialized object.  
+         * Serializes the current target into a Serialization object
+         * @returns the serialized object
          */
         public serialize(): any {
             var serializationObject:any = {};
@@ -91,6 +144,12 @@ module BABYLON {
         }
 
         // Statics
+
+        /**
+         * Creates a new target from serialized data
+         * @param serializationObject defines the serialized data to use
+         * @returns a new MorphTarget
+         */
         public static Parse(serializationObject: any): MorphTarget {
             var result = new MorphTarget(serializationObject.name , serializationObject.influence);
 
@@ -115,6 +174,13 @@ module BABYLON {
             return result;
         }
 
+        /**
+         * Creates a MorphTarget from mesh data
+         * @param mesh defines the source mesh
+         * @param name defines the name to use for the new target
+         * @param influence defines the influence to attach to the target
+         * @returns a new MorphTarget
+         */
         public static FromMesh(mesh: AbstractMesh, name?: string, influence?: number): MorphTarget {
             if (!name) {
                 name = mesh.name;

+ 72 - 8
src/Morph/babylon.morphTargetManager.ts

@@ -1,4 +1,8 @@
 module BABYLON {
+    /**
+     * This class is used to deform meshes using morphing between different targets
+     * @see http://doc.babylonjs.com/how_to/how_to_use_morphtargets
+     */
     export class MorphTargetManager {
         private _targets = new Array<MorphTarget>();
         private _targetObservable = new Array<Nullable<Observer<boolean>>>();
@@ -11,6 +15,10 @@ module BABYLON {
         private _uniqueId = 0;
         private _tempInfluences = new Array<number>();
 
+        /**
+         * Creates a new MorphTargetManager
+         * @param scene defines the current scene
+         */
         public constructor(scene: Nullable<Scene> = null) {
             if (!scene) {
                 scene = Engine.LastCreatedScene;
@@ -25,42 +33,77 @@ module BABYLON {
             }
         }
 
+        /**
+         * Gets the unique ID of this manager
+         */
         public get uniqueId(): number {
             return this._uniqueId;
         }
 
+        /**
+         * Gets the number of vertices handled by this manager
+         */
         public get vertexCount(): number {
             return this._vertexCount
         }
 
+        /**
+         * Gets a boolean indicating if this manager supports morphing of normals
+         */
         public get supportsNormals(): boolean {
             return this._supportsNormals;
         }
 
+        /**
+         * Gets a boolean indicating if this manager supports morphing of tangents
+         */        
         public get supportsTangents(): boolean {
             return this._supportsTangents;
         }
 
+        /**
+         * Gets the number of targets stored in this manager
+         */
         public get numTargets(): number {
             return this._targets.length;
         }
 
+        /**
+         * Gets the number of influencers (ie. the number of targets with influences > 0)
+         */
         public get numInfluencers(): number {
             return this._activeTargets.length;
         }
 
+        /**
+         * Gets the list of influences (one per target)
+         */
         public get influences(): Float32Array {
             return this._influences;
         }
 
+        /**
+         * Gets the active target at specified index. An active target is a target with an influence > 0
+         * @param index defines the index to check
+         * @returns the requested target
+         */
         public getActiveTarget(index: number): MorphTarget {
             return this._activeTargets.data[index];
         }
 
+        /**
+         * Gets the target at specified index
+         * @param index defines the index to check
+         * @returns the requested target
+         */
         public getTarget(index: number): MorphTarget {
             return this._targets[index];
         }
 
+        /**
+         * Add a new target to this manager
+         * @param target defines the target to add
+         */
         public addTarget(target: MorphTarget): void {
             this._targets.push(target);
             this._targetObservable.push(target.onInfluenceChanged.add(needUpdate => {
@@ -69,6 +112,10 @@ module BABYLON {
             this._syncActiveTargets(true);
         }
 
+        /**
+         * Removes a target from the manager
+         * @param target defines the target to remove
+         */
         public removeTarget(target: MorphTarget): void {
             var index = this._targets.indexOf(target);
             if (index >= 0) {
@@ -80,8 +127,8 @@ module BABYLON {
         }
 
         /**
-         * Serializes the current manager into a Serialization object.  
-         * Returns the serialized object.  
+         * Serializes the current manager into a Serialization object
+         * @returns the serialized object
          */
         public serialize(): any {
             var serializationObject:any = {};
@@ -130,17 +177,34 @@ module BABYLON {
                 this._influences[index] = this._tempInfluences[index];
             }
 
-            if (needUpdate && this._scene) {
-                // Flag meshes as dirty to resync with the active targets
-                for (var mesh of this._scene.meshes) {
-                    if ((<any>mesh).morphTargetManager === this) {
-                        (<Mesh>mesh)._syncGeometryWithMorphTargetManager();
-                    }
+            if (needUpdate) {
+                this.synchronize();
+            }
+        }
+
+        /**
+         * Syncrhonize the targets with all the meshes using this morph target manager
+         */
+        public synchronize(): void {
+            if (!this._scene) {
+                return;
+            }
+            // Flag meshes as dirty to resync with the active targets
+            for (var mesh of this._scene.meshes) {
+                if ((<any>mesh).morphTargetManager === this) {
+                    (<Mesh>mesh)._syncGeometryWithMorphTargetManager();
                 }
             }
         }
 
         // Statics
+
+        /**
+         * Creates a new MorphTargetManager from serialized data
+         * @param serializationObject defines the serialized data
+         * @param scene defines the hosting scene
+         * @returns the new MorphTargetManager
+         */
         public static Parse(serializationObject: any, scene: Scene): MorphTargetManager {
             var result = new MorphTargetManager(scene);
 

+ 6 - 3
src/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts

@@ -43,9 +43,12 @@ module BABYLON {
          */
         public get isSupported(): boolean {
             for (var index in this._postProcesses) {
-                for(var ppIndex in this._postProcesses[index]){
-                    if (!this._postProcesses[index][ppIndex].isSupported) {
-                        return false;
+                if (this._postProcesses.hasOwnProperty(index)) {
+                    let pps = this._postProcesses[index];
+                    for(var ppIndex = 0; ppIndex < pps.length; ppIndex++){
+                        if (!pps[ppIndex].isSupported) {
+                            return false;
+                        }
                     }
                 }
             }

+ 6 - 6
src/PostProcess/babylon.bloomEffect.ts

@@ -84,8 +84,8 @@ module BABYLON {
          * @param camera The camera to dispose the effect on.
          */
         public disposeEffects(camera:Camera){
-            for(var effect in this._effects){
-                this._effects[effect].dispose(camera);
+            for(var effectIndex = 0; effectIndex < this._effects.length; effectIndex++){
+                this._effects[effectIndex].dispose(camera);
             }
         }
         
@@ -93,8 +93,8 @@ module BABYLON {
          * Internal
          */
         public _updateEffects(){
-            for(var effect in this._effects){
-                this._effects[effect].updateEffect();
+            for(var effectIndex = 0; effectIndex < this._effects.length; effectIndex++){
+                this._effects[effectIndex].updateEffect();
             }
         }
 
@@ -103,8 +103,8 @@ module BABYLON {
          * @returns if all the contained post processes are ready.
          */
         public _isReady(){
-            for(var effect in this._effects){
-                if(!this._effects[effect].isReady()){
+            for(var effectIndex = 0; effectIndex < this._effects.length; effectIndex++){
+                if(!this._effects[effectIndex].isReady()){
                     return false;
                 }
             }

+ 7 - 7
src/PostProcess/babylon.depthOfFieldEffect.ts

@@ -145,17 +145,17 @@ module BABYLON {
          * @param camera The camera to dispose the effect on.
          */
         public disposeEffects(camera:Camera){
-            for(var effect in this._effects){
-                this._effects[effect].dispose(camera);
-            }            
+            for(var effectIndex = 0; effectIndex < this._effects.length; effectIndex++){
+                this._effects[effectIndex].dispose(camera);
+            }
         }
 
         /**
          * Internal
          */
         public _updateEffects(){
-            for(var effect in this._effects){
-                this._effects[effect].updateEffect();
+            for(var effectIndex = 0; effectIndex <  this._effects.length; effectIndex++){
+                this._effects[effectIndex].updateEffect();
             }
         }
 
@@ -164,8 +164,8 @@ module BABYLON {
          * @returns if all the contained post processes are ready.
          */
         public _isReady(){
-            for(var effect in this._effects){
-                if(!this._effects[effect].isReady()){
+            for(var effectIndex = 0; effectIndex < this._effects.length; effectIndex++){
+                if(!this._effects[effectIndex].isReady()){
                     return false;
                 }
             }

+ 58 - 55
src/Shaders/default.fragment.fx

@@ -259,73 +259,76 @@ void main(void) {
 
 #ifdef REFRACTION
 	vec3 refractionVector = normalize(refract(-viewDirectionW, normalW, vRefractionInfos.y));
-#ifdef REFRACTIONMAP_3D
-
-	refractionVector.y = refractionVector.y * vRefractionInfos.w;
+	#ifdef REFRACTIONMAP_3D
+		refractionVector.y = refractionVector.y * vRefractionInfos.w;
 
-	if (dot(refractionVector, viewDirectionW) < 1.0)
-	{
-		refractionColor = textureCube(refractionCubeSampler, refractionVector).rgb * vRefractionInfos.x;
-	}
-#else
-	vec3 vRefractionUVW = vec3(refractionMatrix * (view * vec4(vPositionW + refractionVector * vRefractionInfos.z, 1.0)));
-
-	vec2 refractionCoords = vRefractionUVW.xy / vRefractionUVW.z;
+		if (dot(refractionVector, viewDirectionW) < 1.0) {
+			refractionColor = textureCube(refractionCubeSampler, refractionVector).rgb;
+		}
+	#else
+		vec3 vRefractionUVW = vec3(refractionMatrix * (view * vec4(vPositionW + refractionVector * vRefractionInfos.z, 1.0)));
 
-	refractionCoords.y = 1.0 - refractionCoords.y;
+		vec2 refractionCoords = vRefractionUVW.xy / vRefractionUVW.z;
 
-	refractionColor = texture2D(refraction2DSampler, refractionCoords).rgb * vRefractionInfos.x;
-#endif
+		refractionCoords.y = 1.0 - refractionCoords.y;
+		
+		refractionColor = texture2D(refraction2DSampler, refractionCoords).rgb;
+	#endif
+	#ifdef IS_REFRACTION_LINEAR
+		refractionColor = toGammaSpace(refractionColor);
+	#endif
+	refractionColor *= vRefractionInfos.x;
 #endif
 
-	// Reflection
-	vec3 reflectionColor = vec3(0., 0., 0.);
+// Reflection
+vec3 reflectionColor = vec3(0., 0., 0.);
 
 #ifdef REFLECTION
 	vec3 vReflectionUVW = computeReflectionCoords(vec4(vPositionW, 1.0), normalW);
 
-#ifdef REFLECTIONMAP_3D
-#ifdef ROUGHNESS
-	float bias = vReflectionInfos.y;
-
-#ifdef SPECULARTERM
-	#ifdef SPECULAR
-		#ifdef GLOSSINESS
-			bias *= (1.0 - specularMapColor.a);
+	#ifdef REFLECTIONMAP_3D
+		#ifdef ROUGHNESS
+			float bias = vReflectionInfos.y;
+
+			#ifdef SPECULARTERM
+				#ifdef SPECULAR
+					#ifdef GLOSSINESS
+						bias *= (1.0 - specularMapColor.a);
+					#endif
+				#endif
+			#endif
+
+			reflectionColor = textureCube(reflectionCubeSampler, vReflectionUVW, bias).rgb;
+		#else
+			reflectionColor = textureCube(reflectionCubeSampler, vReflectionUVW).rgb;
 		#endif
-	#endif
-#endif
-
-	reflectionColor = textureCube(reflectionCubeSampler, vReflectionUVW, bias).rgb * vReflectionInfos.x;
-#else
-	reflectionColor = textureCube(reflectionCubeSampler, vReflectionUVW).rgb * vReflectionInfos.x;
-#endif
-
-#else
-	vec2 coords = vReflectionUVW.xy;
-
-#ifdef REFLECTIONMAP_PROJECTION
-	coords /= vReflectionUVW.z;
-#endif
-
-	coords.y = 1.0 - coords.y;
-
-	reflectionColor = texture2D(reflection2DSampler, coords).rgb * vReflectionInfos.x;
-#endif
+	#else
+		vec2 coords = vReflectionUVW.xy;
 
-#ifdef REFLECTIONFRESNEL
-	float reflectionFresnelTerm = computeFresnelTerm(viewDirectionW, normalW, reflectionRightColor.a, reflectionLeftColor.a);
+		#ifdef REFLECTIONMAP_PROJECTION
+			coords /= vReflectionUVW.z;
+		#endif
 
-#ifdef REFLECTIONFRESNELFROMSPECULAR
-#ifdef SPECULARTERM
-	reflectionColor *= specularColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
-#else
-	reflectionColor *= reflectionLeftColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
-#endif
-#else
-	reflectionColor *= reflectionLeftColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
-#endif
-#endif
+		coords.y = 1.0 - coords.y;
+		reflectionColor = texture2D(reflection2DSampler, coords).rgb;
+	#endif
+	#ifdef IS_REFLECTION_LINEAR
+		reflectionColor = toGammaSpace(reflectionColor);
+	#endif
+	reflectionColor *= vReflectionInfos.x;
+	#ifdef REFLECTIONFRESNEL
+		float reflectionFresnelTerm = computeFresnelTerm(viewDirectionW, normalW, reflectionRightColor.a, reflectionLeftColor.a);
+
+		#ifdef REFLECTIONFRESNELFROMSPECULAR
+			#ifdef SPECULARTERM
+				reflectionColor *= specularColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
+			#else
+				reflectionColor *= reflectionLeftColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
+			#endif
+		#else
+			reflectionColor *= reflectionLeftColor.rgb * (1.0 - reflectionFresnelTerm) + reflectionFresnelTerm * reflectionRightColor.rgb;
+		#endif
+	#endif
 #endif
 
 #ifdef REFRACTIONFRESNEL

BIN
tests/validation/ReferenceImages/texture cache.png


+ 5 - 0
tests/validation/config.json

@@ -455,6 +455,11 @@
       "title": "Local cubemaps",
       "playgroundId": "#RNASML#4",
       "referenceImage": "local cubemaps.png"
+    },
+    {
+      "title": "Texture cache",
+      "playgroundId": "#20OAV9#133",
+      "referenceImage": "texture cache.png"
     }
   ]
 }

+ 2 - 1
tests/validation/index.html

@@ -2,7 +2,8 @@
 <html>
 <head>
 	<title>BabylonJS - Build validation page</title>
-	<link href="index.css" rel="stylesheet" />
+	<link href="index.css" rel="stylesheet" />	
+    <script src="https://preview.babylonjs.com/draco_decoder.js"></script>
 	<script src="https://unpkg.com/earcut@2.1.1/dist/earcut.min.js"></script>
 	<script src="../../Tools/DevLoader/BabylonLoader.js"></script>
 </head>

+ 0 - 1
tests/validation/validate.html

@@ -5,7 +5,6 @@
 	<link href="index.css" rel="stylesheet" />
     <script src="https://preview.babylonjs.com/draco_decoder.js"></script>
     <script src="https://preview.babylonjs.com/cannon.js"></script>
-    <script src="https://preview.babylonjs.com/draco_decoder.js"></script>
     <script src="https://preview.babylonjs.com/Oimo.js"></script>
     <script src="https://preview.babylonjs.com/babylon.js"></script>
     <script src="https://preview.babylonjs.com/inspector/babylon.inspector.bundle.js"></script>