浏览代码

Merge remote-tracking branch 'upstream/master' into return-animationGroup

Gary Hsu 7 年之前
父节点
当前提交
22ac1973fc
共有 100 个文件被更改,包括 27672 次插入280875 次删除
  1. 10215 9556
      Playground/babylon.d.txt
  2. 2 1
      Playground/index-local.html
  3. 2 1
      Playground/index.html
  4. 55 72
      Tools/Gulp/config.json
  5. 8 1
      Tools/Gulp/gulp-addModuleExports.js
  6. 7 23
      Tools/Gulp/gulpfile.js
  7. 3 3
      Viewer/src/viewer/viewer.ts
  8. 2 1
      Viewer/webpack.config.js
  9. 2 1
      Viewer/webpack.gulp.config.js
  10. 13723 13463
      dist/preview release/babylon.d.ts
  11. 59 59
      dist/preview release/babylon.js
  12. 875 1045
      dist/preview release/babylon.max.js
  13. 60 60
      dist/preview release/babylon.worker.js
  14. 0 29676
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts
  15. 0 62
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js
  16. 0 96733
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js
  17. 0 30389
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.module.d.ts
  18. 0 96703
      dist/preview release/customConfigurations/minimalGLTFViewer/es6.js
  19. 15 0
      dist/preview release/earcut.license
  20. 1 0
      dist/preview release/earcut.min.js
  21. 860 1042
      dist/preview release/es6.js
  22. 1 1
      dist/preview release/gltf2Interface/package.json
  23. 0 10
      dist/preview release/gui/babylon.gui.d.ts
  24. 1 10
      dist/preview release/gui/babylon.gui.js
  25. 0 10
      dist/preview release/gui/babylon.gui.module.d.ts
  26. 1 1
      dist/preview release/gui/package.json
  27. 2 2
      dist/preview release/inspector/babylon.inspector.bundle.js
  28. 1 1
      dist/preview release/inspector/package.json
  29. 1 0
      dist/preview release/loaders/babylonjs.loaders.js
  30. 2 2
      dist/preview release/loaders/package.json
  31. 2 2
      dist/preview release/materialsLibrary/babylon.gradientMaterial.js
  32. 1 1
      dist/preview release/materialsLibrary/babylon.gradientMaterial.min.js
  33. 3 2
      dist/preview release/materialsLibrary/babylonjs.materials.js
  34. 2 2
      dist/preview release/materialsLibrary/babylonjs.materials.min.js
  35. 1 1
      dist/preview release/materialsLibrary/package.json
  36. 1 0
      dist/preview release/postProcessesLibrary/babylonjs.postProcess.js
  37. 1 1
      dist/preview release/postProcessesLibrary/package.json
  38. 1 0
      dist/preview release/proceduralTexturesLibrary/babylonjs.proceduralTextures.js
  39. 1 1
      dist/preview release/proceduralTexturesLibrary/package.json
  40. 1 0
      dist/preview release/serializers/babylonjs.serializers.js
  41. 2 2
      dist/preview release/serializers/package.json
  42. 2 402
      dist/preview release/typedocValidationBaseline.json
  43. 4 4
      dist/preview release/viewer/babylon.viewer.d.ts
  44. 66 66
      dist/preview release/viewer/babylon.viewer.js
  45. 918 1073
      dist/preview release/viewer/babylon.viewer.max.js
  46. 1 1
      dist/preview release/viewer/package.json
  47. 8 2
      dist/preview release/what's new.md
  48. 0 8
      gui/src/controls/control.ts
  49. 0 2
      gui/src/controls/textBlock.ts
  50. 2 1
      materialsLibrary/src/gradient/gradient.fragment.fx
  51. 2 0
      materialsLibrary/src/gradient/gradient.vertex.fx
  52. 1 1
      package.json
  53. 71 3
      src/Actions/babylon.action.ts
  54. 1 1
      src/Actions/babylon.actionManager.ts
  55. 155 6
      src/Actions/babylon.condition.ts
  56. 1 0
      src/Bones/babylon.bone.ts
  57. 0 1
      src/Bones/babylon.skeleton.ts
  58. 10 1
      src/Cameras/Inputs/babylon.arcRotateCameraMouseWheelInput.ts
  59. 16 0
      src/Cameras/babylon.camera.ts
  60. 1 1
      src/Cameras/babylon.deviceOrientationCamera.ts
  61. 6 2
      src/Engine/babylon.engine.ts
  62. 14 6
      src/Layer/babylon.glowLayer.ts
  63. 0 3
      src/Layer/babylon.layer.ts
  64. 1 1
      src/Lights/Shadows/babylon.shadowGenerator.ts
  65. 0 1
      src/Lights/babylon.light.ts
  66. 1 1
      src/Lights/babylon.shadowLight.ts
  67. 15 1
      src/Loading/babylon.sceneLoader.ts
  68. 0 2
      src/Materials/Background/babylon.backgroundMaterial.ts
  69. 0 1
      src/Materials/PBR/babylon.pbrBaseMaterial.ts
  70. 0 1
      src/Materials/Textures/babylon.baseTexture.ts
  71. 53 0
      src/Materials/Textures/babylon.dynamicTexture.ts
  72. 0 5
      src/Materials/Textures/babylon.renderTargetTexture.ts
  73. 2 2
      src/Materials/babylon.effect.ts
  74. 1 65
      src/Materials/babylon.imageProcessingConfiguration.ts
  75. 15 5
      src/Materials/babylon.material.ts
  76. 0 1
      src/Materials/babylon.standardMaterial.ts
  77. 0 4
      src/Mesh/babylon.abstractMesh.ts
  78. 0 3
      src/Mesh/babylon.mesh.ts
  79. 6 1
      src/Mesh/babylon.polygonMesh.ts
  80. 63 26
      src/Mesh/babylon.transformNode.ts
  81. 1 1
      src/Particles/EmitterTypes/babylon.boxParticleEmitter.ts
  82. 1 1
      src/Particles/EmitterTypes/babylon.coneParticleEmitter.ts
  83. 2 2
      src/Particles/EmitterTypes/babylon.sphereParticleEmitter.ts
  84. 1 1
      src/Particles/babylon.IParticleSystem.ts
  85. 1 1
      src/Particles/babylon.particle.ts
  86. 0 3
      src/Particles/babylon.solidParticle.ts
  87. 159 185
      src/PostProcess/RenderPipeline/Pipelines/babylon.defaultRenderingPipeline.ts
  88. 0 3
      src/PostProcess/RenderPipeline/Pipelines/babylon.lensRenderingPipeline.ts
  89. 0 15
      src/PostProcess/RenderPipeline/Pipelines/babylon.ssao2RenderingPipeline.ts
  90. 0 10
      src/PostProcess/RenderPipeline/Pipelines/babylon.ssaoRenderingPipeline.ts
  91. 2 2
      src/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts
  92. 2 2
      src/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts
  93. 114 0
      src/PostProcess/babylon.bloomEffect.ts
  94. 33 0
      src/PostProcess/babylon.bloomMergePostProcess.ts
  95. 2 1
      src/PostProcess/babylon.blurPostProcess.ts
  96. 1 1
      src/PostProcess/babylon.chromaticAberrationPostProcess.ts
  97. 1 1
      src/PostProcess/babylon.circleOfConfusionPostProcess.ts
  98. 1 1
      src/PostProcess/babylon.convolutionPostProcess.ts
  99. 1 1
      src/PostProcess/babylon.depthOfFieldBlurPostProcess.ts
  100. 0 0
      src/PostProcess/babylon.depthOfFieldEffect.ts

文件差异内容过多而无法显示
+ 10215 - 9556
Playground/babylon.d.txt


+ 2 - 1
Playground/index-local.html

@@ -13,9 +13,10 @@
         <!-- jszip -->
         <!-- jszip -->
         <script src="js/libs/jszip.min.js"></script>
         <script src="js/libs/jszip.min.js"></script>
         <script src="js/libs/fileSaver.js"></script>
         <script src="js/libs/fileSaver.js"></script>
-        <!-- Physics -->
+        <!-- Dependencies -->
         <script src="../dist/preview%20release/cannon.js"></script>
         <script src="../dist/preview%20release/cannon.js"></script>
         <script src="../dist/preview%20release/Oimo.js"></script>
         <script src="../dist/preview%20release/Oimo.js"></script>
+        <script src="../dist/preview%20release/earcut.min.js"></script>
         <!--Monaco-->
         <!--Monaco-->
         <script src="node_modules/monaco-editor/min/vs/loader.js"></script>
         <script src="node_modules/monaco-editor/min/vs/loader.js"></script>
         <!-- Babylon.js -->
         <!-- Babylon.js -->

+ 2 - 1
Playground/index.html

@@ -33,9 +33,10 @@
         <!-- jszip -->
         <!-- jszip -->
         <script src="js/libs/jszip.min.js"></script>
         <script src="js/libs/jszip.min.js"></script>
         <script src="js/libs/fileSaver.js"></script>
         <script src="js/libs/fileSaver.js"></script>
-        <!-- Physics -->
+        <!-- Dependencies -->
         <script src="https://preview.babylonjs.com/cannon.js"></script>
         <script src="https://preview.babylonjs.com/cannon.js"></script>
         <script src="https://preview.babylonjs.com/Oimo.js"></script>
         <script src="https://preview.babylonjs.com/Oimo.js"></script>
+        <script src="https://preview.babylonjs.com/earcut.min.js"></script>
         <!--Monaco-->
         <!--Monaco-->
         <script src="node_modules/monaco-editor/min/vs/loader.js"></script>
         <script src="node_modules/monaco-editor/min/vs/loader.js"></script>
         <!-- Babylon.js -->
         <!-- Babylon.js -->

+ 55 - 72
Tools/Gulp/config.json

@@ -27,6 +27,11 @@
                 "name": "OIMO",
                 "name": "OIMO",
                 "module": "oimo",
                 "module": "oimo",
                 "optional": true
                 "optional": true
+            },
+            {
+                "name": "earcut",
+                "module": "earcut",
+                "optional": true
             }
             }
         ]
         ]
     },
     },
@@ -74,7 +79,9 @@
             "additionalPostProcess_fxaa",
             "additionalPostProcess_fxaa",
             "additionalPostProcess_circleOfConfusion",
             "additionalPostProcess_circleOfConfusion",
             "additionalPostProcess_depthOfFieldMerge",
             "additionalPostProcess_depthOfFieldMerge",
+            "additionalPostProcess_bloomMerge",
             "additionalPostProcess_depthOfFieldEffect",
             "additionalPostProcess_depthOfFieldEffect",
+            "additionalPostProcess_bloomEffect",
             "additionalPostProcess_imageProcessing",
             "additionalPostProcess_imageProcessing",
             "bones",
             "bones",
             "hdr",
             "hdr",
@@ -110,75 +117,6 @@
             "meshBuilder",
             "meshBuilder",
             "freeCamera",
             "freeCamera",
             "hemisphericLight"
             "hemisphericLight"
-        ],
-        "minimalGLTFViewer": [
-            "pbrMaterial",
-            "freeCamera",
-            "arcRotateCamera",
-            "hemisphericLight",
-            "pointLight",
-            "directionalLight",
-            "spotLight",
-            "animations",
-            "actions",
-            "sprites",
-            "picking",
-            "collisions",
-            "particles",
-            "solidParticles",
-            "additionalMeshes",
-            "meshBuilder",
-            "meshCompression",
-            "audio",
-            "additionalTextures",
-            "shadows",
-            "loader",
-            "userData",
-            "offline",
-            "fresnel",
-            "multiMaterial",
-            "touchCamera",
-            "procedural",
-            "gamepad",
-            "additionalCameras",
-            "postProcesses",
-            "renderingPipeline",
-            "additionalRenderingPipeline",
-            "defaultRenderingPipeline",
-            "depthRenderer",
-            "geometryBufferRenderer",
-            "additionalPostProcesses",
-            "additionalPostProcess_blur",
-            "additionalPostProcess_fxaa",
-            "additionalPostProcess_imageProcessing",
-            "bones",
-            "hdr",
-            "polygonMesh",
-            "csg",
-            "lensFlares",
-            "physics",
-            "textureFormats",
-            "debug",
-            "morphTargets",
-            "octrees",
-            "vr",
-            "virtualJoystick",
-            "optimizations",
-            "highlights",
-            "assetsManager",
-            "serialization",
-            "probes",
-            "layer",
-            "textureTools",
-            "cameraBehaviors",
-            "instrumentation",
-            "backgroundMaterial",
-            "environmentHelper",
-            "materialsLibrary/babylon.gridMaterial.js",
-            "loaders/babylon.glTFFileLoader.js"
-        ],
-        "distributed": [
-            "minimalGLTFViewer"
         ]
         ]
     },
     },
     "workloads": {
     "workloads": {
@@ -803,6 +741,17 @@
                 "chromaticAberration.fragment"
                 "chromaticAberration.fragment"
             ]
             ]
         },
         },
+        "additionalPostProcess_grain": {
+            "files": [
+                "../../src/PostProcess/babylon.grainPostProcess.js"
+            ],
+            "dependUpon": [
+                "postProcesses"
+            ],
+            "shaders": [
+                "grain.fragment"
+            ]
+        },
         "additionalPostProcess_depthOfFieldMerge": {
         "additionalPostProcess_depthOfFieldMerge": {
             "files": [
             "files": [
                 "../../src/PostProcess/babylon.depthOfFieldMergePostProcess.js"
                 "../../src/PostProcess/babylon.depthOfFieldMergePostProcess.js"
@@ -814,6 +763,17 @@
                 "depthOfFieldMerge.fragment"
                 "depthOfFieldMerge.fragment"
             ]
             ]
         },
         },
+        "additionalPostProcess_bloomMerge": {
+            "files": [
+                "../../src/PostProcess/babylon.bloomMergePostProcess.js"
+            ],
+            "dependUpon": [
+                "postProcesses"
+            ],
+            "shaders": [
+                "bloomMerge.fragment"
+            ]
+        },
         "additionalPostProcess_depthOfFieldEffect": {
         "additionalPostProcess_depthOfFieldEffect": {
             "files": [
             "files": [
                 "../../src/PostProcess/babylon.depthOfFieldEffect.js"
                 "../../src/PostProcess/babylon.depthOfFieldEffect.js"
@@ -824,6 +784,16 @@
                 "additionalPostProcess_circleOfConfusion"
                 "additionalPostProcess_circleOfConfusion"
             ]
             ]
         },
         },
+        "additionalPostProcess_bloomEffect": {
+            "files": [
+                "../../src/PostProcess/babylon.bloomEffect.js"
+            ],
+            "dependUpon": [
+                "additionalPostProcess_blur",
+                "additionalPostProcess_bloomMerge",
+                "additionalPostProcess_extractHighlights"
+            ]
+        },
         "additionalPostProcess_fxaa": {
         "additionalPostProcess_fxaa": {
             "files": [
             "files": [
                 "../../src/PostProcess/babylon.fxaaPostProcess.js"
                 "../../src/PostProcess/babylon.fxaaPostProcess.js"
@@ -847,6 +817,17 @@
                 "highlights.fragment"
                 "highlights.fragment"
             ]
             ]
         },
         },
+        "additionalPostProcess_extractHighlights": {
+            "files": [
+                "../../src/PostProcess/babylon.extractHighlightsPostProcess.js"
+            ],
+            "dependUpon": [
+                "postProcesses"
+            ],
+            "shaders": [
+                "extractHighlights.fragment"
+            ]
+        },
         "additionalPostProcess_imageProcessing": {
         "additionalPostProcess_imageProcessing": {
             "files": [
             "files": [
                 "../../src/PostProcess/babylon.imageProcessingPostProcess.js"
                 "../../src/PostProcess/babylon.imageProcessingPostProcess.js"
@@ -866,6 +847,7 @@
                 "../../src/PostProcess/babylon.convolutionPostProcess.js",
                 "../../src/PostProcess/babylon.convolutionPostProcess.js",
                 "../../src/PostProcess/babylon.sharpenPostProcess.js",
                 "../../src/PostProcess/babylon.sharpenPostProcess.js",
                 "../../src/PostProcess/babylon.chromaticAberrationPostProcess.js",
                 "../../src/PostProcess/babylon.chromaticAberrationPostProcess.js",
+                "../../src/PostProcess/babylon.grainPostProcess.js",
                 "../../src/PostProcess/babylon.filterPostProcess.js",
                 "../../src/PostProcess/babylon.filterPostProcess.js",
                 "../../src/PostProcess/babylon.fxaaPostProcess.js",
                 "../../src/PostProcess/babylon.fxaaPostProcess.js",
                 "../../src/PostProcess/babylon.volumetricLightScatteringPostProcess.js",
                 "../../src/PostProcess/babylon.volumetricLightScatteringPostProcess.js",
@@ -873,6 +855,7 @@
                 "../../src/PostProcess/babylon.tonemapPostProcess.js",
                 "../../src/PostProcess/babylon.tonemapPostProcess.js",
                 "../../src/PostProcess/babylon.displayPassPostProcess.js",
                 "../../src/PostProcess/babylon.displayPassPostProcess.js",
                 "../../src/PostProcess/babylon.highlightsPostProcess.js",
                 "../../src/PostProcess/babylon.highlightsPostProcess.js",
+                "../../src/PostProcess/babylon.extractHighlightsPostProcess.js",
                 "../../src/PostProcess/babylon.imageProcessingPostProcess.js"
                 "../../src/PostProcess/babylon.imageProcessingPostProcess.js"
             ],
             ],
             "dependUpon": [
             "dependUpon": [
@@ -919,7 +902,6 @@
                 "ssao.fragment",
                 "ssao.fragment",
                 "ssao2.fragment",
                 "ssao2.fragment",
                 "ssaoCombine.fragment",
                 "ssaoCombine.fragment",
-                "chromaticAberration.fragment",
                 "lensHighlights.fragment",
                 "lensHighlights.fragment",
                 "depthOfField.fragment",
                 "depthOfField.fragment",
                 "standard.fragment"
                 "standard.fragment"
@@ -933,8 +915,10 @@
                 "renderingPipeline",
                 "renderingPipeline",
                 "additionalPostProcess_fxaa",
                 "additionalPostProcess_fxaa",
                 "additionalPostProcess_chromaticAberration",
                 "additionalPostProcess_chromaticAberration",
+                "additionalPostProcess_grain",
                 "additionalPostProcess_sharpen",
                 "additionalPostProcess_sharpen",
-                "additionalPostProcess_depthOfFieldEffect"
+                "additionalPostProcess_depthOfFieldEffect",
+                "additionalPostProcess_bloomEffect"
             ]
             ]
         },
         },
         "bones": {
         "bones": {
@@ -970,7 +954,6 @@
         },
         },
         "polygonMesh": {
         "polygonMesh": {
             "files": [
             "files": [
-                "../../src/Tools/babylon.earcut.js",
                 "../../src/Mesh/babylon.polygonMesh.js"
                 "../../src/Mesh/babylon.polygonMesh.js"
             ],
             ],
             "dependUpon": [
             "dependUpon": [

+ 8 - 1
Tools/Gulp/gulp-addModuleExports.js

@@ -74,7 +74,14 @@ ${afterInitText}
 ${String(file.contents)}
 ${String(file.contents)}
     ${varName.name === 'BABYLON' || varName.name === 'INSPECTOR' ? `
     ${varName.name === 'BABYLON' || varName.name === 'INSPECTOR' ? `
 var globalObject = (typeof global !== 'undefined') ? global : ((typeof window !== 'undefined') ? window : this);
 var globalObject = (typeof global !== 'undefined') ? global : ((typeof window !== 'undefined') ? window : this);
-globalObject["${varName.name}"] = ${varName.name}` : ''}
+globalObject["${varName.name}"] = ${varName.name};
+//backwards compatibility
+if(typeof earcut !== 'undefined') {
+    globalObject["Earcut"] = {
+        earcut: earcut
+    };
+}` : ''}
+
     return ${base}${(config.subModule && !config.extendsRoot) ? '.' + varName.name : ''};
     return ${base}${(config.subModule && !config.extendsRoot) ? '.' + varName.name : ''};
 });
 });
 `;
 `;

+ 7 - 23
Tools/Gulp/gulpfile.js

@@ -532,21 +532,6 @@ gulp.task("typescript-libraries", config.modules, function () {
 });
 });
 
 
 /**
 /**
- * Dynamic custom configurations.
- */
-config.buildConfigurations.distributed.map(function (customConfiguration) {
-    gulp.task(customConfiguration, function (cb) {
-        config.build.currentConfig = customConfiguration;
-        config.build.outputDirectory = config.build.outputCustomConfigurationsDirectory + "/" + customConfiguration;
-        runSequence("typescript-compile", "build", cb);
-    });
-});
-
-gulp.task("typescript-customConfigurations", function (cb) {
-    runSequence(config.buildConfigurations.distributed, cb);
-});
-
-/**
  * Custom build with full path file control; used by profile.html
  * Custom build with full path file control; used by profile.html
  */
  */
 gulp.task("build-custom", function (cb) {
 gulp.task("build-custom", function (cb) {
@@ -557,7 +542,7 @@ gulp.task("build-custom", function (cb) {
  * Do it all.
  * Do it all.
  */
  */
 gulp.task("typescript-all", function (cb) {
 gulp.task("typescript-all", function (cb) {
-    runSequence("typescript", "typescript-libraries", "typescript-customConfigurations", cb);
+    runSequence("typescript", "typescript-libraries", cb);
 });
 });
 
 
 /**
 /**
@@ -604,13 +589,12 @@ gulp.task("watch", ["srcTscWatch"], function () {
 
 
 gulp.task("intellisense", function () {
 gulp.task("intellisense", function () {
     gulp.src(config.build.intellisenseSources)
     gulp.src(config.build.intellisenseSources)
-        .pipe(concat(config.build.intellisenseFile))
-        .pipe(replace(/^\s*_.*?$/gm, ""))
-        .pipe(replace(/^\s*private .*?$/gm, ""))
-        .pipe(replace(/^\s*public _.*?$/gm, ""))
-        .pipe(replace(/^\s*protected .*?$/gm, ""))
-        .pipe(replace(/^\s*public static _.*?$/gm, ""))
-        .pipe(replace(/^\s*static _.*?$/gm, ""))
+        .pipe(concat(config.build.intellisenseFile))    
+        .pipe(replace(/^\s+_.*?;/gm, ""))
+        .pipe(replace(/^\s+_[\S\s]*?}/gm, ""))
+        .pipe(replace(/^\s*readonly _/gm, "protected readonly _"))
+        .pipe(replace(/^\s*static _/gm, "private static _"))
+        .pipe(replace(/^\s*abstract _/gm, ""))
         .pipe(gulp.dest(config.build.playgroundDirectory));
         .pipe(gulp.dest(config.build.playgroundDirectory));
 });
 });
 
 

+ 3 - 3
Viewer/src/viewer/viewer.ts

@@ -930,9 +930,9 @@ export abstract class AbstractViewer {
 
 
     /**
     /**
      * Alters render settings to reduce features based on hardware feature limitations
      * Alters render settings to reduce features based on hardware feature limitations
-     * @param options Viewer options to modify
+     * @param enableHDR Allows the viewer to run in HDR mode.
      */
      */
-    protected _handleHardwareLimitations() {
+    protected _handleHardwareLimitations(enableHDR = true) {
         //flip rendering settings switches based on hardware support
         //flip rendering settings switches based on hardware support
         let maxVaryingRows = this.engine.getCaps().maxVaryingVectors;
         let maxVaryingRows = this.engine.getCaps().maxVaryingVectors;
         let maxFragmentSamplers = this.engine.getCaps().maxTexturesImageUnits;
         let maxFragmentSamplers = this.engine.getCaps().maxTexturesImageUnits;
@@ -949,7 +949,7 @@ export abstract class AbstractViewer {
         let linearHalfFloatTargets = caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering;
         let linearHalfFloatTargets = caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering;
         let linearFloatTargets = caps.textureFloatRender && caps.textureFloatLinearFiltering;
         let linearFloatTargets = caps.textureFloatRender && caps.textureFloatLinearFiltering;
 
 
-        this._hdrSupport = !!(linearFloatTargets || linearHalfFloatTargets);
+        this._hdrSupport = enableHDR && !!(linearFloatTargets || linearHalfFloatTargets);
 
 
         if (linearHalfFloatTargets) {
         if (linearHalfFloatTargets) {
             this._defaultHighpTextureType = Engine.TEXTURETYPE_HALF_FLOAT;
             this._defaultHighpTextureType = Engine.TEXTURETYPE_HALF_FLOAT;

+ 2 - 1
Viewer/webpack.config.js

@@ -26,7 +26,8 @@ module.exports = {
         // until physics will be integrated in the viewer, ignore cannon
         // until physics will be integrated in the viewer, ignore cannon
         cannon: 'CANNON',
         cannon: 'CANNON',
         oimo: 'OIMO',
         oimo: 'OIMO',
-        './Oimo': 'OIMO'
+        './Oimo': 'OIMO',
+        "earcut": true
     },
     },
     devtool: 'source-map',
     devtool: 'source-map',
     plugins: [
     plugins: [

+ 2 - 1
Viewer/webpack.gulp.config.js

@@ -13,7 +13,8 @@ module.exports = {
         cannon: 'CANNON',
         cannon: 'CANNON',
         oimo: 'OIMO',
         oimo: 'OIMO',
         vertx: true,
         vertx: true,
-        "./Oimo": "OIMO"
+        "./Oimo": "OIMO",
+        "earcut": true
     },
     },
     resolve: {
     resolve: {
         extensions: ['.ts', '.js'],
         extensions: ['.ts', '.js'],

文件差异内容过多而无法显示
+ 13723 - 13463
dist/preview release/babylon.d.ts


文件差异内容过多而无法显示
+ 59 - 59
dist/preview release/babylon.js


文件差异内容过多而无法显示
+ 875 - 1045
dist/preview release/babylon.max.js


文件差异内容过多而无法显示
+ 60 - 60
dist/preview release/babylon.worker.js


文件差异内容过多而无法显示
+ 0 - 29676
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


文件差异内容过多而无法显示
+ 0 - 62
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


文件差异内容过多而无法显示
+ 0 - 96733
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js


文件差异内容过多而无法显示
+ 0 - 30389
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.module.d.ts


文件差异内容过多而无法显示
+ 0 - 96703
dist/preview release/customConfigurations/minimalGLTFViewer/es6.js


+ 15 - 0
dist/preview release/earcut.license

@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2016, Mapbox
+
+Permission to use, copy, modify, and/or distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.

文件差异内容过多而无法显示
+ 1 - 0
dist/preview release/earcut.min.js


文件差异内容过多而无法显示
+ 860 - 1042
dist/preview release/es6.js


+ 1 - 1
dist/preview release/gltf2Interface/package.json

@@ -1,7 +1,7 @@
 {
 {
     "name": "babylonjs-gltf2interface",
     "name": "babylonjs-gltf2interface",
     "description": "A typescript declaration of babylon's gltf2 inteface.",
     "description": "A typescript declaration of babylon's gltf2 inteface.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

+ 0 - 10
dist/preview release/gui/babylon.gui.d.ts

@@ -211,42 +211,34 @@ declare module BABYLON.GUI {
         readonly typeName: string;
         readonly typeName: string;
         /**
         /**
         * An event triggered when the pointer move over the control.
         * An event triggered when the pointer move over the control.
-        * @type {BABYLON.Observable}
         */
         */
         onPointerMoveObservable: Observable<Vector2>;
         onPointerMoveObservable: Observable<Vector2>;
         /**
         /**
         * An event triggered when the pointer move out of the control.
         * An event triggered when the pointer move out of the control.
-        * @type {BABYLON.Observable}
         */
         */
         onPointerOutObservable: Observable<Control>;
         onPointerOutObservable: Observable<Control>;
         /**
         /**
         * An event triggered when the pointer taps the control
         * An event triggered when the pointer taps the control
-        * @type {BABYLON.Observable}
         */
         */
         onPointerDownObservable: Observable<Vector2WithInfo>;
         onPointerDownObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when pointer up
         * An event triggered when pointer up
-        * @type {BABYLON.Observable}
         */
         */
         onPointerUpObservable: Observable<Vector2WithInfo>;
         onPointerUpObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when a control is clicked on
         * An event triggered when a control is clicked on
-        * @type {BABYLON.Observable}
         */
         */
         onPointerClickObservable: Observable<Vector2WithInfo>;
         onPointerClickObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when pointer enters the control
         * An event triggered when pointer enters the control
-        * @type {BABYLON.Observable}
         */
         */
         onPointerEnterObservable: Observable<Control>;
         onPointerEnterObservable: Observable<Control>;
         /**
         /**
         * An event triggered when the control is marked as dirty
         * An event triggered when the control is marked as dirty
-        * @type {BABYLON.Observable}
         */
         */
         onDirtyObservable: Observable<Control>;
         onDirtyObservable: Observable<Control>;
         /**
         /**
        * An event triggered after the control is drawn
        * An event triggered after the control is drawn
-       * @type {BABYLON.Observable}
        */
        */
         onAfterDrawObservable: Observable<Control>;
         onAfterDrawObservable: Observable<Control>;
         alpha: number;
         alpha: number;
@@ -571,12 +563,10 @@ declare module BABYLON.GUI {
         private _outlineColor;
         private _outlineColor;
         /**
         /**
         * An event triggered after the text is changed
         * An event triggered after the text is changed
-        * @type {BABYLON.Observable}
         */
         */
         onTextChangedObservable: Observable<TextBlock>;
         onTextChangedObservable: Observable<TextBlock>;
         /**
         /**
         * An event triggered after the text was broken up into lines
         * An event triggered after the text was broken up into lines
-        * @type {BABYLON.Observable}
         */
         */
         onLinesReadyObservable: Observable<TextBlock>;
         onLinesReadyObservable: Observable<TextBlock>;
         /**
         /**

+ 1 - 10
dist/preview release/gui/babylon.gui.js

@@ -909,42 +909,34 @@ var BABYLON;
                 this._linkOffsetY = new GUI.ValueAndUnit(0);
                 this._linkOffsetY = new GUI.ValueAndUnit(0);
                 /**
                 /**
                 * An event triggered when the pointer move over the control.
                 * An event triggered when the pointer move over the control.
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerMoveObservable = new BABYLON.Observable();
                 this.onPointerMoveObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when the pointer move out of the control.
                 * An event triggered when the pointer move out of the control.
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerOutObservable = new BABYLON.Observable();
                 this.onPointerOutObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when the pointer taps the control
                 * An event triggered when the pointer taps the control
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerDownObservable = new BABYLON.Observable();
                 this.onPointerDownObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when pointer up
                 * An event triggered when pointer up
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerUpObservable = new BABYLON.Observable();
                 this.onPointerUpObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when a control is clicked on
                 * An event triggered when a control is clicked on
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerClickObservable = new BABYLON.Observable();
                 this.onPointerClickObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when pointer enters the control
                 * An event triggered when pointer enters the control
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onPointerEnterObservable = new BABYLON.Observable();
                 this.onPointerEnterObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered when the control is marked as dirty
                 * An event triggered when the control is marked as dirty
-                * @type {BABYLON.Observable}
                 */
                 */
                 this.onDirtyObservable = new BABYLON.Observable();
                 this.onDirtyObservable = new BABYLON.Observable();
                 /**
                 /**
                * An event triggered after the control is drawn
                * An event triggered after the control is drawn
-               * @type {BABYLON.Observable}
                */
                */
                 this.onAfterDrawObservable = new BABYLON.Observable();
                 this.onAfterDrawObservable = new BABYLON.Observable();
             }
             }
@@ -3413,12 +3405,10 @@ var BABYLON;
                 _this._outlineColor = "white";
                 _this._outlineColor = "white";
                 /**
                 /**
                 * An event triggered after the text is changed
                 * An event triggered after the text is changed
-                * @type {BABYLON.Observable}
                 */
                 */
                 _this.onTextChangedObservable = new BABYLON.Observable();
                 _this.onTextChangedObservable = new BABYLON.Observable();
                 /**
                 /**
                 * An event triggered after the text was broken up into lines
                 * An event triggered after the text was broken up into lines
-                * @type {BABYLON.Observable}
                 */
                 */
                 _this.onLinesReadyObservable = new BABYLON.Observable();
                 _this.onLinesReadyObservable = new BABYLON.Observable();
                 _this.text = text;
                 _this.text = text;
@@ -5139,5 +5129,6 @@ var BABYLON;
 })(BABYLON || (BABYLON = {}));
 })(BABYLON || (BABYLON = {}));
 
 
     
     
+
     return BABYLON.GUI;
     return BABYLON.GUI;
 });
 });

+ 0 - 10
dist/preview release/gui/babylon.gui.module.d.ts

@@ -216,42 +216,34 @@ declare module BABYLON.GUI {
         readonly typeName: string;
         readonly typeName: string;
         /**
         /**
         * An event triggered when the pointer move over the control.
         * An event triggered when the pointer move over the control.
-        * @type {BABYLON.Observable}
         */
         */
         onPointerMoveObservable: Observable<Vector2>;
         onPointerMoveObservable: Observable<Vector2>;
         /**
         /**
         * An event triggered when the pointer move out of the control.
         * An event triggered when the pointer move out of the control.
-        * @type {BABYLON.Observable}
         */
         */
         onPointerOutObservable: Observable<Control>;
         onPointerOutObservable: Observable<Control>;
         /**
         /**
         * An event triggered when the pointer taps the control
         * An event triggered when the pointer taps the control
-        * @type {BABYLON.Observable}
         */
         */
         onPointerDownObservable: Observable<Vector2WithInfo>;
         onPointerDownObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when pointer up
         * An event triggered when pointer up
-        * @type {BABYLON.Observable}
         */
         */
         onPointerUpObservable: Observable<Vector2WithInfo>;
         onPointerUpObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when a control is clicked on
         * An event triggered when a control is clicked on
-        * @type {BABYLON.Observable}
         */
         */
         onPointerClickObservable: Observable<Vector2WithInfo>;
         onPointerClickObservable: Observable<Vector2WithInfo>;
         /**
         /**
         * An event triggered when pointer enters the control
         * An event triggered when pointer enters the control
-        * @type {BABYLON.Observable}
         */
         */
         onPointerEnterObservable: Observable<Control>;
         onPointerEnterObservable: Observable<Control>;
         /**
         /**
         * An event triggered when the control is marked as dirty
         * An event triggered when the control is marked as dirty
-        * @type {BABYLON.Observable}
         */
         */
         onDirtyObservable: Observable<Control>;
         onDirtyObservable: Observable<Control>;
         /**
         /**
        * An event triggered after the control is drawn
        * An event triggered after the control is drawn
-       * @type {BABYLON.Observable}
        */
        */
         onAfterDrawObservable: Observable<Control>;
         onAfterDrawObservable: Observable<Control>;
         alpha: number;
         alpha: number;
@@ -576,12 +568,10 @@ declare module BABYLON.GUI {
         private _outlineColor;
         private _outlineColor;
         /**
         /**
         * An event triggered after the text is changed
         * An event triggered after the text is changed
-        * @type {BABYLON.Observable}
         */
         */
         onTextChangedObservable: Observable<TextBlock>;
         onTextChangedObservable: Observable<TextBlock>;
         /**
         /**
         * An event triggered after the text was broken up into lines
         * An event triggered after the text was broken up into lines
-        * @type {BABYLON.Observable}
         */
         */
         onLinesReadyObservable: Observable<TextBlock>;
         onLinesReadyObservable: Observable<TextBlock>;
         /**
         /**

+ 1 - 1
dist/preview release/gui/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-gui",
     "name": "babylonjs-gui",
     "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
     "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/inspector/babylon.inspector.bundle.js


+ 1 - 1
dist/preview release/inspector/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-inspector",
     "name": "babylonjs-inspector",
     "description": "The Babylon.js inspector.",
     "description": "The Babylon.js inspector.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

+ 1 - 0
dist/preview release/loaders/babylonjs.loaders.js

@@ -5571,5 +5571,6 @@ var BABYLON;
 //# sourceMappingURL=KHR_lights.js.map
 //# sourceMappingURL=KHR_lights.js.map
 
 
     
     
+
     return BABYLON;
     return BABYLON;
 });
 });

+ 2 - 2
dist/preview release/loaders/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-loaders",
     "name": "babylonjs-loaders",
     "description": "The Babylon.js file loaders library is an extension you can use to load different 3D file types into a Babylon scene.",
     "description": "The Babylon.js file loaders library is an extension you can use to load different 3D file types into a Babylon scene.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -27,7 +27,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs-gltf2interface": "3.2.0-beta.1"
+        "babylonjs-gltf2interface": "3.2.0-beta.3"
     },
     },
     "peerDependencies": {
     "peerDependencies": {
         "babylonjs": ">=3.2.0-alpha"
         "babylonjs": ">=3.2.0-alpha"

文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/materialsLibrary/babylon.gradientMaterial.js


文件差异内容过多而无法显示
+ 1 - 1
dist/preview release/materialsLibrary/babylon.gradientMaterial.min.js


文件差异内容过多而无法显示
+ 3 - 2
dist/preview release/materialsLibrary/babylonjs.materials.js


文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/materialsLibrary/babylonjs.materials.min.js


+ 1 - 1
dist/preview release/materialsLibrary/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-materials",
     "name": "babylonjs-materials",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

文件差异内容过多而无法显示
+ 1 - 0
dist/preview release/postProcessesLibrary/babylonjs.postProcess.js


+ 1 - 1
dist/preview release/postProcessesLibrary/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-post-process",
     "name": "babylonjs-post-process",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

文件差异内容过多而无法显示
+ 1 - 0
dist/preview release/proceduralTexturesLibrary/babylonjs.proceduralTextures.js


+ 1 - 1
dist/preview release/proceduralTexturesLibrary/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-procedural-textures",
     "name": "babylonjs-procedural-textures",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

+ 1 - 0
dist/preview release/serializers/babylonjs.serializers.js

@@ -1798,5 +1798,6 @@ var BABYLON;
 //# sourceMappingURL=babylon.glTFMaterial.js.map
 //# sourceMappingURL=babylon.glTFMaterial.js.map
 
 
     
     
+
     return BABYLON;
     return BABYLON;
 });
 });

+ 2 - 2
dist/preview release/serializers/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-serializers",
     "name": "babylonjs-serializers",
     "description": "The Babylon.js serializers library is an extension you can use to serialize Babylon scenes.",
     "description": "The Babylon.js serializers library is an extension you can use to serialize Babylon scenes.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -27,7 +27,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs-gltf2interface": "3.2.0-beta.1"
+        "babylonjs-gltf2interface": "3.2.0-beta.3"
     },
     },
     "peerDependencies": {
     "peerDependencies": {
         "babylonjs": ">=3.2.0-alpha"
         "babylonjs": ">=3.2.0-alpha"

+ 2 - 402
dist/preview release/typedocValidationBaseline.json

@@ -1,7 +1,7 @@
 {
 {
-  "errors": 7152,
+  "errors": 7080,
   "babylon.typedoc.json": {
   "babylon.typedoc.json": {
-    "errors": 7152,
+    "errors": 7080,
     "AnimationKeyInterpolation": {
     "AnimationKeyInterpolation": {
       "Enumeration": {
       "Enumeration": {
         "Comments": {
         "Comments": {
@@ -1418,147 +1418,15 @@
       }
       }
     },
     },
     "Action": {
     "Action": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
-      "Constructor": {
-        "new Action": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "triggerOptions": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "condition": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        }
-      },
       "Property": {
       "Property": {
-        "_actionManager": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "onBeforeExecuteObservable": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "trigger": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
         "triggerOptions": {
         "triggerOptions": {
           "Comments": {
           "Comments": {
             "MissingText": true
             "MissingText": true
           }
           }
-        },
-        "_GetTargetProperty": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "_SerializeValueAsString": {
-          "Comments": {
-            "MissingText": true
-          }
         }
         }
       },
       },
       "Method": {
       "Method": {
-        "_executeCurrent": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "evt": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "_getEffectiveTarget": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "target": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "propertyPath": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "_getProperty": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "propertyPath": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "_prepare": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "execute": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "evt": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "getTriggerParameter": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "serialize": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "parent": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "skipToNextActiveAction": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
         "then": {
         "then": {
-          "Comments": {
-            "MissingText": true
-          },
           "Parameter": {
           "Parameter": {
             "action": {
             "action": {
               "Comments": {
               "Comments": {
@@ -8024,85 +7892,6 @@
         }
         }
       }
       }
     },
     },
-    "Condition": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
-      "Constructor": {
-        "new Condition": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "actionManager": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        }
-      },
-      "Property": {
-        "_actionManager": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "_currentResult": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "_evaluationId": {
-          "Comments": {
-            "MissingText": true
-          }
-        }
-      },
-      "Method": {
-        "_getEffectiveTarget": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "target": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "propertyPath": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "_getProperty": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "propertyPath": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "isValid": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "serialize": {
-          "Comments": {
-            "MissingText": true
-          }
-        }
-      }
-    },
     "CubeTexture": {
     "CubeTexture": {
       "Class": {
       "Class": {
         "Comments": {
         "Comments": {
@@ -8777,55 +8566,15 @@
     },
     },
     "DefaultRenderingPipeline": {
     "DefaultRenderingPipeline": {
       "Property": {
       "Property": {
-        "BlurXPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
-        "BlurYPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
-        "ChromaticAberrationPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
-        "CopyBackPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
-        "FinalMergePostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
         "FxaaPostProcessId": {
         "FxaaPostProcessId": {
           "Naming": {
           "Naming": {
             "NotCamelCase": true
             "NotCamelCase": true
           }
           }
         },
         },
-        "HighLightsPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
         "ImageProcessingPostProcessId": {
         "ImageProcessingPostProcessId": {
           "Naming": {
           "Naming": {
             "NotCamelCase": true
             "NotCamelCase": true
           }
           }
-        },
-        "PassPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
-        },
-        "SharpenPostProcessId": {
-          "Naming": {
-            "NotCamelCase": true
-          }
         }
         }
       }
       }
     },
     },
@@ -8861,101 +8610,6 @@
         }
         }
       }
       }
     },
     },
-    "DynamicTexture": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
-      "Method": {
-        "clear": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "drawText": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "text": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "x": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "y": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "font": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "color": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "clearColor": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "invertY": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "update": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "getContext": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "scaleTo": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "width": {
-              "Comments": {
-                "MissingText": true
-              }
-            },
-            "height": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        },
-        "update": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "invertY": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
-        }
-      }
-    },
     "EasingFunction": {
     "EasingFunction": {
       "Class": {
       "Class": {
         "Comments": {
         "Comments": {
@@ -9196,11 +8850,6 @@
             "MissingText": true
             "MissingText": true
           }
           }
         },
         },
-        "enableOfflineSupport": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
         "forcePOTTextures": {
         "forcePOTTextures": {
           "Comments": {
           "Comments": {
             "MissingText": true
             "MissingText": true
@@ -23329,11 +22978,6 @@
       }
       }
     },
     },
     "PredicateCondition": {
     "PredicateCondition": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
       "Property": {
       "Property": {
         "predicate": {
         "predicate": {
           "Comments": {
           "Comments": {
@@ -31252,11 +30896,6 @@
       }
       }
     },
     },
     "StateCondition": {
     "StateCondition": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
       "Property": {
       "Property": {
         "value": {
         "value": {
           "Comments": {
           "Comments": {
@@ -34564,11 +34203,6 @@
       }
       }
     },
     },
     "ValueCondition": {
     "ValueCondition": {
-      "Class": {
-        "Comments": {
-          "MissingText": true
-        }
-      },
       "Property": {
       "Property": {
         "operator": {
         "operator": {
           "Comments": {
           "Comments": {
@@ -34584,40 +34218,6 @@
           "Comments": {
           "Comments": {
             "MissingText": true
             "MissingText": true
           }
           }
-        },
-        "IsDifferent": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "IsEqual": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "IsGreater": {
-          "Comments": {
-            "MissingText": true
-          }
-        },
-        "IsLesser": {
-          "Comments": {
-            "MissingText": true
-          }
-        }
-      },
-      "Method": {
-        "GetOperatorName": {
-          "Comments": {
-            "MissingText": true
-          },
-          "Parameter": {
-            "operator": {
-              "Comments": {
-                "MissingText": true
-              }
-            }
-          }
         }
         }
       }
       }
     },
     },

+ 4 - 4
dist/preview release/viewer/babylon.viewer.d.ts

@@ -1099,10 +1099,10 @@ declare module BabylonViewer {
          */
          */
         protected _initEnvironment(model?: ViewerModel): Promise<BABYLON.Scene>;
         protected _initEnvironment(model?: ViewerModel): Promise<BABYLON.Scene>;
         /**
         /**
-         * Alters render settings to reduce features based on hardware feature limitations
-         * @param options Viewer options to modify
-         */
-        protected _handleHardwareLimitations(): void;
+		 * Alters render settings to reduce features based on hardware feature limitations
+		 * @param enableHDR Allows the viewer to run in HDR mode.
+		 */
+        protected _handleHardwareLimitations(enableHDR?: boolean): void;
         /**
         /**
          * Injects all the spectre shader in the babylon shader store
          * Injects all the spectre shader in the babylon shader store
          */
          */

文件差异内容过多而无法显示
+ 66 - 66
dist/preview release/viewer/babylon.viewer.js


文件差异内容过多而无法显示
+ 918 - 1073
dist/preview release/viewer/babylon.viewer.max.js


+ 1 - 1
dist/preview release/viewer/package.json

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-viewer",
     "name": "babylonjs-viewer",
     "description": "A simple-to-use viewer based on BabylonJS to display 3D elements natively",
     "description": "A simple-to-use viewer based on BabylonJS to display 3D elements natively",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

+ 8 - 2
dist/preview release/what's new.md

@@ -13,7 +13,7 @@
 - Added [VideoDome](http://doc.babylonjs.com/how_to/360videodome) class to easily support 360 videos. Demo [here](https://www.babylonjs-playground.com/frame.html#1E9JQ8#7) ([DavidHGillen](https://github.com/DavidHGillen))
 - Added [VideoDome](http://doc.babylonjs.com/how_to/360videodome) class to easily support 360 videos. Demo [here](https://www.babylonjs-playground.com/frame.html#1E9JQ8#7) ([DavidHGillen](https://github.com/DavidHGillen))
 - Added [GlowLayer](https://doc.babylonjs.com/how_to/glow_layer) to easily support glow from emissive materials. Demo [here](http://www.babylonjs.com/demos/GlowLayer/) ([sebavan](https://github.com/sebavan))
 - Added [GlowLayer](https://doc.babylonjs.com/how_to/glow_layer) to easily support glow from emissive materials. Demo [here](http://www.babylonjs.com/demos/GlowLayer/) ([sebavan](https://github.com/sebavan))
 - New [AssetContainer](http://doc.babylonjs.com/how_to/how_to_use_assetcontainer) class and loading methods ([trevordev](https://github.com/trevordev))
 - New [AssetContainer](http://doc.babylonjs.com/how_to/how_to_use_assetcontainer) class and loading methods ([trevordev](https://github.com/trevordev))
-- Added [depth of field](https://www.babylonjs-playground.com/frame.html#8F5HYV#5), sharpening, MSAA, chromatic aberration and grain effect to the default pipeline ([trevordev](https://github.com/trevordev))
+- Added [depth of field](https://www.babylonjs-playground.com/frame.html#8F5HYV#9), sharpening, MSAA, chromatic aberration and grain effect to the default pipeline ([trevordev](https://github.com/trevordev))
 - Added support for [animation weights](http://doc.babylonjs.com/babylon101/animations#animation-weights). Demo [here](https://www.babylonjs-playground.com/#IQN716#9) ([deltakosh](https://github.com/deltakosh))
 - Added support for [animation weights](http://doc.babylonjs.com/babylon101/animations#animation-weights). Demo [here](https://www.babylonjs-playground.com/#IQN716#9) ([deltakosh](https://github.com/deltakosh))
 - Added [sub emitters for particle system](http://doc.babylonjs.com/babylon101/particles#sub-emitters) which will spawn new particle systems when particles dies. Demo [here](https://www.babylonjs-playground.com/frame.html#9NHBCC#1) ([IbraheemOsama](https://github.com/IbraheemOsama))
 - Added [sub emitters for particle system](http://doc.babylonjs.com/babylon101/particles#sub-emitters) which will spawn new particle systems when particles dies. Demo [here](https://www.babylonjs-playground.com/frame.html#9NHBCC#1) ([IbraheemOsama](https://github.com/IbraheemOsama))
 - New [Babylon.js](http://doc.babylonjs.com/resources/maya) and [glTF](http://doc.babylonjs.com/resources/maya_to_gltf) exporter for Autodesk Maya ([Noalak](https://github.com/Noalak))
 - New [Babylon.js](http://doc.babylonjs.com/resources/maya) and [glTF](http://doc.babylonjs.com/resources/maya_to_gltf) exporter for Autodesk Maya ([Noalak](https://github.com/Noalak))
@@ -22,9 +22,12 @@
 - Physics - Latest production version of Oimo.js is being used - 1.0.9 ([RaananW](https://github.com/RaananW))
 - Physics - Latest production version of Oimo.js is being used - 1.0.9 ([RaananW](https://github.com/RaananW))
 - Shadows - Introduces [PCF](https://doc.babylonjs.com/babylon101/shadows#percentage-closer-filtering-webgl2-only) and [PCSS](https://doc.babylonjs.com/babylon101/shadows#contact-hardening-shadow-webgl2-only) support in Webgl 2 ([sebavan](https://github.com/sebavan)))
 - Shadows - Introduces [PCF](https://doc.babylonjs.com/babylon101/shadows#percentage-closer-filtering-webgl2-only) and [PCSS](https://doc.babylonjs.com/babylon101/shadows#contact-hardening-shadow-webgl2-only) support in Webgl 2 ([sebavan](https://github.com/sebavan)))
 
 
+## Documentation
+- Tons of functions and classes received the code comments they deserved (All the community)
+- Moved the class API documentation to Typedoc ([deltakosh](https://github.com/deltakosh))
+
 ## Updates
 ## Updates
 
 
-- Tons of functions and classes received the code comments they deserved (All the community)
 - New [particle system emitter shapes](http://doc.babylonjs.com/babylon101/particles#particles-shapes): cone and sphere ([IbraheemOsama](https://github.com/IbraheemOsama))
 - New [particle system emitter shapes](http://doc.babylonjs.com/babylon101/particles#particles-shapes): cone and sphere ([IbraheemOsama](https://github.com/IbraheemOsama))
 - Added support for 16bits TGA ([deltakosh](https://github.com/deltakosh))
 - Added support for 16bits TGA ([deltakosh](https://github.com/deltakosh))
 - New `AnimationPropertiesOverride` class used to simplify setting animation properties on child animations. [Documentation](http://doc.babylonjs.com/babylon101/animations#overriding-properties) ([deltakosh](https://github.com/deltakosh))
 - New `AnimationPropertiesOverride` class used to simplify setting animation properties on child animations. [Documentation](http://doc.babylonjs.com/babylon101/animations#overriding-properties) ([deltakosh](https://github.com/deltakosh))
@@ -99,8 +102,10 @@
 - Lightmap texture in PBR material follow the gammaSpace Flag of the texture ([sebavan](https://github.com/sebavan))
 - Lightmap texture in PBR material follow the gammaSpace Flag of the texture ([sebavan](https://github.com/sebavan))
 - Added setTextureFromPostProcessOutput to bind the output of a postprocess into an effect ([trevordev](https://github.com/trevordev))
 - Added setTextureFromPostProcessOutput to bind the output of a postprocess into an effect ([trevordev](https://github.com/trevordev))
 - Added support for primitive modes to glTF 2.0 loader. ([bghgary](https://github.com/bghgary)]
 - Added support for primitive modes to glTF 2.0 loader. ([bghgary](https://github.com/bghgary)]
+- Updated bloom effect to only bloom areas of the image above a luminance threshold ([trevordev](https://github.com/trevordev))
 - Cannon and Oimo are optional dependencies ([RaananW](https://github.com/RaananW))
 - Cannon and Oimo are optional dependencies ([RaananW](https://github.com/RaananW))
 - Shadows - Introduces [Normal Bias](https://doc.babylonjs.com/babylon101/shadows#normal-bias-since-32) ([sebavan](https://github.com/sebavan)))
 - Shadows - Introduces [Normal Bias](https://doc.babylonjs.com/babylon101/shadows#normal-bias-since-32) ([sebavan](https://github.com/sebavan)))
+- Earcut is an external, optional dependency. ([RaananW](https://github.com/RaananW))
 - Return animation groups when calling `SceneLoader.ImportMesh`. ([bghgary](https://github.com/bghgary)]
 - Return animation groups when calling `SceneLoader.ImportMesh`. ([bghgary](https://github.com/bghgary)]
 
 
 ## Bug fixes
 ## Bug fixes
@@ -128,3 +133,4 @@
 - VertexData.merge no longer supports merging of data that do not have the same set of attributes. ([bghgary](https://github.com/bghgary)]
 - VertexData.merge no longer supports merging of data that do not have the same set of attributes. ([bghgary](https://github.com/bghgary)]
 - glTF 2.0 loader now creates a mesh for each primitive instead of merging the primitives together into one mesh. If a mesh only has one primitive, the behavior is the same as before. This change only affects meshes that have multiple primitives. ([bghgary](https://github.com/bghgary)]
 - glTF 2.0 loader now creates a mesh for each primitive instead of merging the primitives together into one mesh. If a mesh only has one primitive, the behavior is the same as before. This change only affects meshes that have multiple primitives. ([bghgary](https://github.com/bghgary)]
 - Engine's onCanvasPointerOutObservable will now return a PointerEvent instead of the Engine. ([trevordev](https://github.com/trevordev))
 - Engine's onCanvasPointerOutObservable will now return a PointerEvent instead of the Engine. ([trevordev](https://github.com/trevordev))
+- Removed public references to default rendering pipeline's internal post process ([trevordev](https://github.com/trevordev))

+ 0 - 8
gui/src/controls/control.ts

@@ -69,49 +69,41 @@ module BABYLON.GUI {
 
 
         /**
         /**
         * An event triggered when the pointer move over the control.
         * An event triggered when the pointer move over the control.
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerMoveObservable = new Observable<Vector2>();
         public onPointerMoveObservable = new Observable<Vector2>();
 
 
         /**
         /**
         * An event triggered when the pointer move out of the control.
         * An event triggered when the pointer move out of the control.
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerOutObservable = new Observable<Control>();
         public onPointerOutObservable = new Observable<Control>();
 
 
         /**
         /**
         * An event triggered when the pointer taps the control
         * An event triggered when the pointer taps the control
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerDownObservable = new Observable<Vector2WithInfo>();
         public onPointerDownObservable = new Observable<Vector2WithInfo>();
 
 
         /**
         /**
         * An event triggered when pointer up
         * An event triggered when pointer up
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerUpObservable = new Observable<Vector2WithInfo>();
         public onPointerUpObservable = new Observable<Vector2WithInfo>();
 
 
         /**
         /**
         * An event triggered when a control is clicked on
         * An event triggered when a control is clicked on
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerClickObservable = new Observable<Vector2WithInfo>();
         public onPointerClickObservable = new Observable<Vector2WithInfo>();
 
 
         /**
         /**
         * An event triggered when pointer enters the control
         * An event triggered when pointer enters the control
-        * @type {BABYLON.Observable}
         */
         */
         public onPointerEnterObservable = new Observable<Control>();
         public onPointerEnterObservable = new Observable<Control>();
 
 
         /**
         /**
         * An event triggered when the control is marked as dirty
         * An event triggered when the control is marked as dirty
-        * @type {BABYLON.Observable}
         */
         */
         public onDirtyObservable = new Observable<Control>();
         public onDirtyObservable = new Observable<Control>();
 
 
         /**
         /**
        * An event triggered after the control is drawn
        * An event triggered after the control is drawn
-       * @type {BABYLON.Observable}
        */
        */
         public onAfterDrawObservable = new Observable<Control>();
         public onAfterDrawObservable = new Observable<Control>();
 
 

+ 0 - 2
gui/src/controls/textBlock.ts

@@ -14,13 +14,11 @@ module BABYLON.GUI {
         private _outlineColor: string = "white";
         private _outlineColor: string = "white";
         /**
         /**
         * An event triggered after the text is changed
         * An event triggered after the text is changed
-        * @type {BABYLON.Observable}
         */
         */
         public onTextChangedObservable = new Observable<TextBlock>();
         public onTextChangedObservable = new Observable<TextBlock>();
 
 
         /**
         /**
         * An event triggered after the text was broken up into lines
         * An event triggered after the text was broken up into lines
-        * @type {BABYLON.Observable}
         */
         */
         public onLinesReadyObservable = new Observable<TextBlock>();
         public onLinesReadyObservable = new Observable<TextBlock>();
 
 

+ 2 - 1
materialsLibrary/src/gradient/gradient.fragment.fx

@@ -12,6 +12,7 @@ uniform float smoothness;
 
 
 // Input
 // Input
 varying vec3 vPositionW;
 varying vec3 vPositionW;
+varying vec3 vPosition;
 
 
 #ifdef NORMAL
 #ifdef NORMAL
 varying vec3 vNormalW;
 varying vec3 vNormalW;
@@ -51,7 +52,7 @@ void main(void) {
 
 
 	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
 	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
 
 
-    float h = normalize(vPositionW).y + offset;
+    float h = normalize(vPosition).y + offset;
     float mysmoothness = clamp(smoothness, 0.01, max(smoothness, 10.));
     float mysmoothness = clamp(smoothness, 0.01, max(smoothness, 10.));
 
 
     vec4 baseColor = mix(bottomColor, topColor, max(pow(max(h, 0.0), mysmoothness), 0.0));
     vec4 baseColor = mix(bottomColor, topColor, max(pow(max(h, 0.0), mysmoothness), 0.0));

+ 2 - 0
materialsLibrary/src/gradient/gradient.vertex.fx

@@ -35,6 +35,7 @@ uniform float pointSize;
 
 
 // Output
 // Output
 varying vec3 vPositionW;
 varying vec3 vPositionW;
+varying vec3 vPosition;
 #ifdef NORMAL
 #ifdef NORMAL
 varying vec3 vNormalW;
 varying vec3 vNormalW;
 #endif
 #endif
@@ -56,6 +57,7 @@ void main(void) {
 
 
 	vec4 worldPos = finalWorld * vec4(position, 1.0);
 	vec4 worldPos = finalWorld * vec4(position, 1.0);
 	vPositionW = vec3(worldPos);
 	vPositionW = vec3(worldPos);
+	vPosition = position;
 
 
 #ifdef NORMAL
 #ifdef NORMAL
 	vNormalW = normalize(vec3(finalWorld * vec4(normal, 0.0)));
 	vNormalW = normalize(vec3(finalWorld * vec4(normal, 0.0)));

+ 1 - 1
package.json

@@ -9,7 +9,7 @@
     ],
     ],
     "name": "babylonjs",
     "name": "babylonjs",
     "description": "Babylon.js is a JavaScript 3D engine based on webgl.",
     "description": "Babylon.js is a JavaScript 3D engine based on webgl.",
-    "version": "3.2.0-beta.1",
+    "version": "3.2.0-beta.3",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"

+ 71 - 3
src/Actions/babylon.action.ts

@@ -1,6 +1,18 @@
 module BABYLON {
 module BABYLON {
+    /**
+     * The action to be carried out following a trigger
+     * @see http://doc.babylonjs.com/how_to/how_to_use_actions#available-actions
+     */
     export class Action {
     export class Action {
+        /**
+         * Trigger for the action
+         */
         public trigger: number;
         public trigger: number;
+
+        /**
+         * Internal only - manager for action
+         * @ignore 
+         */
         public _actionManager: ActionManager;
         public _actionManager: ActionManager;
 
 
         private _nextActiveAction: Action;
         private _nextActiveAction: Action;
@@ -8,8 +20,16 @@
         private _condition?: Condition;
         private _condition?: Condition;
         private _triggerParameter: any;
         private _triggerParameter: any;
 
 
+        /**
+        * An event triggered prior to action being executed.
+        */
         public onBeforeExecuteObservable = new Observable<Action>();
         public onBeforeExecuteObservable = new Observable<Action>();
 
 
+        /**
+         * Creates a new Action
+         * @param triggerOptions the trigger, with or without parameters, for the action
+         * @param condition an optional determinant of action 
+         */
         constructor(public triggerOptions: any, condition?: Condition) {
         constructor(public triggerOptions: any, condition?: Condition) {
 
 
             if (triggerOptions.parameter) {
             if (triggerOptions.parameter) {
@@ -23,14 +43,25 @@
             this._condition = condition;
             this._condition = condition;
         }
         }
 
 
-        // Methods
+        /**
+         * Internal only
+         * @ignore 
+         */
         public _prepare(): void {
         public _prepare(): void {
         }
         }
 
 
+        /**
+         * Gets the trigger parameters
+         * @returns the trigger parameters
+         */
         public getTriggerParameter(): any {
         public getTriggerParameter(): any {
             return this._triggerParameter;
             return this._triggerParameter;
         }
         }
 
 
+        /**
+         * Internal only - executes current action event
+         * @ignore 
+         */
         public _executeCurrent(evt?: ActionEvent): void {
         public _executeCurrent(evt?: ActionEvent): void {
             if (this._nextActiveAction._condition) {
             if (this._nextActiveAction._condition) {
                 var condition = this._nextActiveAction._condition;
                 var condition = this._nextActiveAction._condition;
@@ -59,10 +90,17 @@
             this.skipToNextActiveAction();
             this.skipToNextActiveAction();
         }
         }
 
 
+        /**
+         * Execute placeholder for child classes
+         * @param evt optional action event
+         */
         public execute(evt?: ActionEvent): void {
         public execute(evt?: ActionEvent): void {
 
 
         }
         }
 
 
+        /**
+         * Skips to next active action
+         */
         public skipToNextActiveAction(): void {
         public skipToNextActiveAction(): void {
             if (this._nextActiveAction._child) {
             if (this._nextActiveAction._child) {
 
 
@@ -76,6 +114,12 @@
             }
             }
         }
         }
 
 
+        /**
+         * Adds action to chain of actions, may be a DoNothingAction
+         * @param index The index of the attribute.
+         * @returns The action passed in
+         * @see https://www.babylonjs-playground.com/#1T30HR#0
+         */
         public then(action: Action): Action {
         public then(action: Action): Action {
             this._child = action;
             this._child = action;
 
 
@@ -85,18 +129,34 @@
             return action;
             return action;
         }
         }
 
 
+        /**
+         * Internal only
+         * @ignore 
+         */
         public _getProperty(propertyPath: string): string {
         public _getProperty(propertyPath: string): string {
             return this._actionManager._getProperty(propertyPath);
             return this._actionManager._getProperty(propertyPath);
         }
         }
 
 
+        /**
+         * Internal only
+         * @ignore 
+         */
         public _getEffectiveTarget(target: any, propertyPath: string): any {
         public _getEffectiveTarget(target: any, propertyPath: string): any {
             return this._actionManager._getEffectiveTarget(target, propertyPath);
             return this._actionManager._getEffectiveTarget(target, propertyPath);
         }
         }
         
         
+        /**
+         * Serialize placeholder for child classes
+         * @param parent of child
+         * @returns the serialized object
+         */
         public serialize(parent: any): any {
         public serialize(parent: any): any {
         }
         }
         
         
-        // Called by BABYLON.Action objects in serialize(...). Internal use
+        /**
+         * Internal only called by serialize
+         * @ignore 
+         */
         protected _serialize(serializedAction: any, parent?: any): any {
         protected _serialize(serializedAction: any, parent?: any): any {
             var serializationObject: any = { 
             var serializationObject: any = { 
                 type: 1,
                 type: 1,
@@ -127,6 +187,10 @@
             return serializationObject;
             return serializationObject;
         }
         }
         
         
+        /**
+         * Internal only
+         * @ignore 
+         */
         public static _SerializeValueAsString = (value: any): string => {
         public static _SerializeValueAsString = (value: any): string => {
             if (typeof value === "number") {
             if (typeof value === "number") {
                 return value.toString();
                 return value.toString();
@@ -152,7 +216,11 @@
             
             
             return value; // string
             return value; // string
         };
         };
-    
+        
+        /**
+         * Internal only
+         * @ignore 
+         */
         public static _GetTargetProperty = (target: Scene | Node) => {
         public static _GetTargetProperty = (target: Scene | Node) => {
             return {
             return {
                 name: "target",
                 name: "target",

+ 1 - 1
src/Actions/babylon.actionManager.ts

@@ -1,7 +1,7 @@
 module BABYLON {
 module BABYLON {
 
 
     /**
     /**
-     * ActionEvent is the event beint sent when an action is triggered.
+     * ActionEvent is the event being sent when an action is triggered.
      */
      */
     export class ActionEvent {
     export class ActionEvent {
         /**
         /**

+ 155 - 6
src/Actions/babylon.condition.ts

@@ -1,29 +1,69 @@
 module BABYLON {
 module BABYLON {
+    /**
+     * A Condition applied to an Action 
+     */
     export class Condition {
     export class Condition {
+        /**
+         * Internal only - manager for action
+         * @ignore 
+         */
         public _actionManager: ActionManager;
         public _actionManager: ActionManager;
 
 
+        /**
+         * Internal only
+         * @ignore 
+         */
         public _evaluationId: number;
         public _evaluationId: number;
+
+        /**
+         * Internal only
+         * @ignore 
+         */
         public _currentResult: boolean;
         public _currentResult: boolean;
 
 
+        /**
+         * Creates a new Condition
+         * @param actionManager the manager of the action the condition is applied to 
+         */
         constructor(actionManager: ActionManager) {
         constructor(actionManager: ActionManager) {
             this._actionManager = actionManager;
             this._actionManager = actionManager;
         }
         }
 
 
+        /**
+         * Check if the current condition is valid
+         * @returns a boolean
+         */
         public isValid(): boolean {
         public isValid(): boolean {
             return true;
             return true;
         }
         }
 
 
+        /**
+         * Internal only 
+         * @ignore 
+         */
         public _getProperty(propertyPath: string): string {
         public _getProperty(propertyPath: string): string {
             return this._actionManager._getProperty(propertyPath);
             return this._actionManager._getProperty(propertyPath);
         }
         }
 
 
+        /**
+         * Internal only 
+         * @ignore 
+         */
         public _getEffectiveTarget(target: any, propertyPath: string): any {
         public _getEffectiveTarget(target: any, propertyPath: string): any {
             return this._actionManager._getEffectiveTarget(target, propertyPath);
             return this._actionManager._getEffectiveTarget(target, propertyPath);
         }
         }
         
         
+        /**
+         * Serialize placeholder for child classes
+         * @returns the serialized object
+         */
         public serialize(): any {
         public serialize(): any {
         }
         }
         
         
+        /**
+         * Internal only 
+         * @ignore 
+         */
         protected _serialize(serializedCondition: any): any {
         protected _serialize(serializedCondition: any): any {
             return { 
             return { 
                 type: 2, // Condition
                 type: 2, // Condition
@@ -34,36 +74,95 @@
         }
         }
     }
     }
 
 
+    /**
+     * Defines specific conditional operators as extensions of Condition
+     */
     export class ValueCondition extends Condition {
     export class ValueCondition extends Condition {
-        // Statics
+        
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private static _IsEqual = 0;
         private static _IsEqual = 0;
+
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private static _IsDifferent = 1;
         private static _IsDifferent = 1;
+
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private static _IsGreater = 2;
         private static _IsGreater = 2;
+
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private static _IsLesser = 3;
         private static _IsLesser = 3;
 
 
+        /**
+         * returns the number for IsEqual
+         */
         public static get IsEqual(): number {
         public static get IsEqual(): number {
             return ValueCondition._IsEqual;
             return ValueCondition._IsEqual;
         }
         }
 
 
+        /**
+         * Returns the number for IsDifferent
+         */
         public static get IsDifferent(): number {
         public static get IsDifferent(): number {
             return ValueCondition._IsDifferent;
             return ValueCondition._IsDifferent;
         }
         }
 
 
+        /**
+         * Returns the number for IsGreater
+         */
         public static get IsGreater(): number {
         public static get IsGreater(): number {
             return ValueCondition._IsGreater;
             return ValueCondition._IsGreater;
         }
         }
 
 
+        /**
+         * Returns the number for IsLesser
+         */
         public static get IsLesser(): number {
         public static get IsLesser(): number {
             return ValueCondition._IsLesser;
             return ValueCondition._IsLesser;
         }
         }
 
 
-        // Members
+        /**
+         * Internal only The action manager for the condition
+         * @ignore 
+         */
         public _actionManager: ActionManager;
         public _actionManager: ActionManager;
 
 
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private _target: any;
         private _target: any;
+
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private _effectiveTarget: any;
         private _effectiveTarget: any;
+
+        /**
+         * Internal only 
+         * @ignore 
+         */
         private _property: string;
         private _property: string;
 
 
+        /**
+         * Creates a new ValueCondition
+         * @param actionManager manager for the action the condition applies to
+         * @param target for the action
+         * @param propertyPath path to specify the property of the target the conditional operator uses 
+         * @param value the vale compared by the conditional operator against the current value of the property
+         * @param operator the conditional operator, default {BABYLON.ValueCondition.IsEqual}  
+         */
         constructor(actionManager: ActionManager, target: any, public propertyPath: string, public value: any, public operator: number = ValueCondition.IsEqual) {
         constructor(actionManager: ActionManager, target: any, public propertyPath: string, public value: any, public operator: number = ValueCondition.IsEqual) {
             super(actionManager);
             super(actionManager);
 
 
@@ -72,7 +171,10 @@
             this._property = this._getProperty(this.propertyPath);
             this._property = this._getProperty(this.propertyPath);
         }
         }
 
 
-        // Methods
+        /**
+         * Compares the given value with the property value for the specified conditional operator
+         * @returns the result of the comparison
+         */
         public isValid(): boolean {
         public isValid(): boolean {
             switch (this.operator) {
             switch (this.operator) {
                 case ValueCondition.IsGreater:
                 case ValueCondition.IsGreater:
@@ -94,6 +196,10 @@
             return false;
             return false;
         }
         }
         
         
+        /**
+         * Serialize the ValueCondition into a JSON compatible object
+         * @returns serialization object
+         */
         public serialize(): any {
         public serialize(): any {
             return this._serialize({
             return this._serialize({
                name: "ValueCondition",
                name: "ValueCondition",
@@ -106,6 +212,11 @@
             });
             });
         }
         }
         
         
+        /**
+         * Gets the name of the conditional operator for the ValueCondition
+         * @param operator the conditional operator
+         * @returns the name 
+         */
         public static GetOperatorName(operator: number): string {
         public static GetOperatorName(operator: number): string {
             switch (operator) {
             switch (operator) {
                 case ValueCondition._IsEqual: return "IsEqual";
                 case ValueCondition._IsEqual: return "IsEqual";
@@ -117,37 +228,75 @@
         }
         }
     }
     }
 
 
+    /**
+     * Defines a predicate condition as an extension of Condition
+     */
     export class PredicateCondition extends Condition {
     export class PredicateCondition extends Condition {
-        // Members
+        
+        /**
+         * Internal only - manager for action
+         * @ignore 
+         */
         public _actionManager: ActionManager;
         public _actionManager: ActionManager;
 
 
 
 
+        /**
+         * Creates a new {BABYLON.PredicateCondition}
+         * @param actionManager manager for the action the condition applies to
+         * @param predicate 
+         */
         constructor(actionManager: ActionManager, public predicate: () => boolean) {
         constructor(actionManager: ActionManager, public predicate: () => boolean) {
             super(actionManager);
             super(actionManager);
         }
         }
 
 
+        /**
+         * @returns the validity of the predicate condition
+         */
         public isValid(): boolean {
         public isValid(): boolean {
             return this.predicate();
             return this.predicate();
         }
         }
     }
     }
 
 
+    /**
+     * Defines a state condition as an extension of {BABYLON.Condition}
+     */
     export class StateCondition extends Condition {
     export class StateCondition extends Condition {
-        // Members
+        
+        /**
+         * Internal only - manager for action
+         * @ignore 
+         */
         public _actionManager: ActionManager;
         public _actionManager: ActionManager;
 
 
+        /**
+         * Internal only
+         * @ignore 
+         */
         private _target: any;
         private _target: any;
 
 
+        /**
+         * Creates a new {BABYLON.StateCondition}
+         * @param actionManager manager for the action the condition applies to
+         * @param target of the condition
+         * @param value to compare with target state 
+         */
         constructor(actionManager: ActionManager, target: any, public value: string) {
         constructor(actionManager: ActionManager, target: any, public value: string) {
             super(actionManager);
             super(actionManager);
 
 
             this._target = target;
             this._target = target;
         }
         }
 
 
-        // Methods
+        /**
+         * @returns the validity of the state
+         */
         public isValid(): boolean {
         public isValid(): boolean {
             return this._target.state === this.value;
             return this._target.state === this.value;
         }
         }
         
         
+        /**
+         * Serialize the {BABYLON.StateCondition} into a JSON compatible object
+         * @returns serialization object
+         */
         public serialize(): any {
         public serialize(): any {
             return this._serialize({
             return this._serialize({
                name: "StateCondition",
                name: "StateCondition",

+ 1 - 0
src/Bones/babylon.bone.ts

@@ -189,6 +189,7 @@
 
 
         public markAsDirty(): void {
         public markAsDirty(): void {
             this._currentRenderId++;
             this._currentRenderId++;
+            this._childRenderId++;
             this._skeleton._markAsDirty();
             this._skeleton._markAsDirty();
         }
         }
 
 

+ 0 - 1
src/Bones/babylon.skeleton.ts

@@ -31,7 +31,6 @@
         // Events
         // Events
         /**
         /**
          * An event triggered before computing the skeleton's matrices
          * An event triggered before computing the skeleton's matrices
-         * @type {BABYLON.Observable}
          */
          */
         public onBeforeComputeObservable = new Observable<Skeleton>();
         public onBeforeComputeObservable = new Observable<Skeleton>();
 
 

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

@@ -23,7 +23,16 @@ module BABYLON {
                 var delta = 0;
                 var delta = 0;
 
 
                 if (event.wheelDelta) {
                 if (event.wheelDelta) {
-                    delta = this.wheelDeltaPercentage ? (event.wheelDelta * 0.01) * this.camera.radius * this.wheelDeltaPercentage : event.wheelDelta / (this.wheelPrecision * 40);
+                    if (this.wheelDeltaPercentage) {
+                        var wheelDelta = (event.wheelDelta * 0.01 * this.wheelDeltaPercentage) * this.camera.radius;
+                        if (event.wheelDelta > 0) {
+                            delta = wheelDelta / (1.0 + this.wheelDeltaPercentage);
+                        } else {
+                            delta = wheelDelta * (1.0 + this.wheelDeltaPercentage);
+                        }
+                    } else {
+                        delta = event.wheelDelta / (this.wheelPrecision * 40);
+                    }
                 } else if (event.detail) {
                 } else if (event.detail) {
                     delta = -event.detail / this.wheelPrecision;
                     delta = -event.detail / this.wheelPrecision;
                 }
                 }

+ 16 - 0
src/Cameras/babylon.camera.ts

@@ -252,6 +252,22 @@
             return (this._activeMeshes.indexOf(mesh) !== -1);
             return (this._activeMeshes.indexOf(mesh) !== -1);
         }
         }
 
 
+        /**
+         * Is this camera ready to be used/rendered
+         * @param completeCheck defines if a complete check (including post processes) has to be done (false by default)
+         * @return true if the camera is ready
+         */
+        public isReady(completeCheck = false): boolean {
+            if (completeCheck) {
+                for (var pp of this._postProcesses) {
+                    if (pp && !pp.isReady()) {
+                        return false;
+                    }
+                }
+            }
+            return super.isReady(completeCheck);
+        }
+
         //Cache
         //Cache
         public _initCache() {
         public _initCache() {
             super._initCache();
             super._initCache();

+ 1 - 1
src/Cameras/babylon.deviceOrientationCamera.ts

@@ -10,7 +10,7 @@ module BABYLON {
         private _quaternionCache: Quaternion;
         private _quaternionCache: Quaternion;
 
 
         /**
         /**
-         * Creates a new device orientation camera. @see DeviceOrientationCamera
+         * Creates a new device orientation camera
          * @param name The name of the camera
          * @param name The name of the camera
          * @param position The start position camera
          * @param position The start position camera
          * @param scene The scene the camera belongs to
          * @param scene The scene the camera belongs to

+ 6 - 2
src/Engine/babylon.engine.ts

@@ -597,7 +597,7 @@
         }
         }
 
 
         public static get Version(): string {
         public static get Version(): string {
-            return "3.2.0-beta.1";
+            return "3.2.0-beta.3";
         }
         }
 
 
         // Updatable statics so stick with vars here
         // Updatable statics so stick with vars here
@@ -612,8 +612,12 @@
         public cullBackFaces = true;
         public cullBackFaces = true;
         public renderEvenInBackground = true;
         public renderEvenInBackground = true;
         public preventCacheWipeBetweenFrames = false;
         public preventCacheWipeBetweenFrames = false;
-        // To enable/disable IDB support and avoid XHR on .manifest
+
+        /** 
+         * To enable/disable IDB support and avoid XHR on .manifest
+         **/
         public enableOfflineSupport = false;
         public enableOfflineSupport = false;
+
         public scenes = new Array<Scene>();
         public scenes = new Array<Scene>();
         public postProcesses = new Array<PostProcess>();
         public postProcesses = new Array<PostProcess>();
 
 

+ 14 - 6
src/Layer/babylon.glowLayer.ts

@@ -169,6 +169,14 @@
             blurTextureWidth = this._engine.needPOTTextures ? Tools.GetExponentOfTwo(blurTextureWidth, this._maxSize) : blurTextureWidth;
             blurTextureWidth = this._engine.needPOTTextures ? Tools.GetExponentOfTwo(blurTextureWidth, this._maxSize) : blurTextureWidth;
             blurTextureHeight = this._engine.needPOTTextures ? Tools.GetExponentOfTwo(blurTextureHeight, this._maxSize) : blurTextureHeight;
             blurTextureHeight = this._engine.needPOTTextures ? Tools.GetExponentOfTwo(blurTextureHeight, this._maxSize) : blurTextureHeight;
 
 
+            var textureType = 0;
+            if (this._engine.getCaps().textureHalfFloatRender) {
+                textureType = Engine.TEXTURETYPE_HALF_FLOAT;
+            }
+            else {
+                textureType = Engine.TEXTURETYPE_UNSIGNED_INT;
+            }
+
             this._blurTexture1 = new RenderTargetTexture("GlowLayerBlurRTT",
             this._blurTexture1 = new RenderTargetTexture("GlowLayerBlurRTT",
                 {
                 {
                     width: blurTextureWidth,
                     width: blurTextureWidth,
@@ -177,7 +185,7 @@
                 this._scene,
                 this._scene,
                 false,
                 false,
                 true,
                 true,
-                Engine.TEXTURETYPE_HALF_FLOAT);
+                textureType);
             this._blurTexture1.wrapU = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture1.wrapU = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture1.wrapV = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture1.wrapV = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture1.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);
             this._blurTexture1.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);
@@ -195,7 +203,7 @@
                 this._scene,
                 this._scene,
                 false,
                 false,
                 true,
                 true,
-                Engine.TEXTURETYPE_HALF_FLOAT);
+                textureType);
             this._blurTexture2.wrapU = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture2.wrapU = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture2.wrapV = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture2.wrapV = Texture.CLAMP_ADDRESSMODE;
             this._blurTexture2.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);
             this._blurTexture2.updateSamplingMode(Texture.BILINEAR_SAMPLINGMODE);
@@ -208,7 +216,7 @@
                     width:  blurTextureWidth,
                     width:  blurTextureWidth,
                     height: blurTextureHeight
                     height: blurTextureHeight
                 },
                 },
-                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, Engine.TEXTURETYPE_HALF_FLOAT);
+                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, textureType);
             this._horizontalBlurPostprocess1.width = blurTextureWidth;
             this._horizontalBlurPostprocess1.width = blurTextureWidth;
             this._horizontalBlurPostprocess1.height = blurTextureHeight;
             this._horizontalBlurPostprocess1.height = blurTextureHeight;
             this._horizontalBlurPostprocess1.onApplyObservable.add(effect => {
             this._horizontalBlurPostprocess1.onApplyObservable.add(effect => {
@@ -219,13 +227,13 @@
                     width:  blurTextureWidth,
                     width:  blurTextureWidth,
                     height: blurTextureHeight
                     height: blurTextureHeight
                 },
                 },
-                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, Engine.TEXTURETYPE_HALF_FLOAT);
+                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, textureType);
 
 
             this._horizontalBlurPostprocess2 = new BlurPostProcess("GlowLayerHBP2", new Vector2(1.0, 0), this._options.blurKernelSize / 2, {
             this._horizontalBlurPostprocess2 = new BlurPostProcess("GlowLayerHBP2", new Vector2(1.0, 0), this._options.blurKernelSize / 2, {
                     width:  blurTextureWidth2,
                     width:  blurTextureWidth2,
                     height: blurTextureHeight2
                     height: blurTextureHeight2
                 },
                 },
-                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, Engine.TEXTURETYPE_HALF_FLOAT);
+                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, textureType);
             this._horizontalBlurPostprocess2.width = blurTextureWidth2;
             this._horizontalBlurPostprocess2.width = blurTextureWidth2;
             this._horizontalBlurPostprocess2.height = blurTextureHeight2;
             this._horizontalBlurPostprocess2.height = blurTextureHeight2;
             this._horizontalBlurPostprocess2.onApplyObservable.add(effect => {
             this._horizontalBlurPostprocess2.onApplyObservable.add(effect => {
@@ -236,7 +244,7 @@
                     width:  blurTextureWidth2,
                     width:  blurTextureWidth2,
                     height: blurTextureHeight2
                     height: blurTextureHeight2
                 },
                 },
-                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, Engine.TEXTURETYPE_HALF_FLOAT);
+                null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, textureType);
 
 
             this._postProcesses = [ this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1, this._horizontalBlurPostprocess2, this._verticalBlurPostprocess2 ];
             this._postProcesses = [ this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1, this._horizontalBlurPostprocess2, this._verticalBlurPostprocess2 ];
             this._postProcesses1 = [ this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1 ];
             this._postProcesses1 = [ this._horizontalBlurPostprocess1, this._verticalBlurPostprocess1 ];

+ 0 - 3
src/Layer/babylon.layer.ts

@@ -20,7 +20,6 @@
 
 
         /**
         /**
         * An event triggered when the layer is disposed.
         * An event triggered when the layer is disposed.
-        * @type {BABYLON.Observable}
         */
         */
         public onDisposeObservable = new Observable<Layer>();
         public onDisposeObservable = new Observable<Layer>();
 
 
@@ -34,7 +33,6 @@
 
 
         /**
         /**
         * An event triggered before rendering the scene
         * An event triggered before rendering the scene
-        * @type {BABYLON.Observable}
         */
         */
         public onBeforeRenderObservable = new Observable<Layer>();
         public onBeforeRenderObservable = new Observable<Layer>();
 
 
@@ -48,7 +46,6 @@
 
 
         /**
         /**
         * An event triggered after rendering the scene
         * An event triggered after rendering the scene
-        * @type {BABYLON.Observable}
         */
         */
         public onAfterRenderObservable = new Observable<Layer>();
         public onAfterRenderObservable = new Observable<Layer>();
 
 

+ 1 - 1
src/Lights/Shadows/babylon.shadowGenerator.ts

@@ -76,7 +76,7 @@
     }
     }
 
 
     /**
     /**
-     * Default implementation of @see IShadowGenerator.
+     * Default implementation IShadowGenerator.
      * This is the main object responsible of generating shadows in the framework.
      * This is the main object responsible of generating shadows in the framework.
      * Documentation: https://doc.babylonjs.com/babylon101/shadows
      * Documentation: https://doc.babylonjs.com/babylon101/shadows
      */
      */

+ 0 - 1
src/Lights/babylon.light.ts

@@ -374,7 +374,6 @@ module BABYLON {
         /**
         /**
          * Set the enabled state of this node.
          * Set the enabled state of this node.
          * @param value - the new enabled state
          * @param value - the new enabled state
-         * @see isEnabled
          */
          */
         public setEnabled(value: boolean): void {
         public setEnabled(value: boolean): void {
             super.setEnabled(value);
             super.setEnabled(value);

+ 1 - 1
src/Lights/babylon.shadowLight.ts

@@ -111,7 +111,7 @@
     }
     }
 
 
     /**
     /**
-     * Base implementation of @see IShadowLight
+     * Base implementation IShadowLight
      * It groups all the common behaviour in order to reduce dupplication and better follow the DRY pattern.
      * It groups all the common behaviour in order to reduce dupplication and better follow the DRY pattern.
      */
      */
     export abstract class ShadowLight extends Light implements IShadowLight {
     export abstract class ShadowLight extends Light implements IShadowLight {

+ 15 - 1
src/Loading/babylon.sceneLoader.ts

@@ -309,7 +309,21 @@
             }
             }
 
 
             if (rootUrl.indexOf("file:") === -1) {
             if (rootUrl.indexOf("file:") === -1) {
-                if (scene.getEngine().enableOfflineSupport) {
+                let canUseOfflineSupport = scene.getEngine().enableOfflineSupport;
+                if (canUseOfflineSupport) {
+                    // Also check for exceptions
+                    let exceptionFound = false;
+                    for (var regex of scene.disableOfflineSupportExceptionRules) {
+                        if (regex.test(rootUrl + sceneFilename)) {
+                            exceptionFound = true;
+                            break;
+                        }
+                    }
+
+                    canUseOfflineSupport = !exceptionFound;
+                }
+
+                if (canUseOfflineSupport) {
                     // Checking if a manifest file has been set for this scene and if offline mode has been requested
                     // Checking if a manifest file has been set for this scene and if offline mode has been requested
                     database = new Database(rootUrl + sceneFilename, manifestChecked);
                     database = new Database(rootUrl + sceneFilename, manifestChecked);
                 }
                 }

+ 0 - 2
src/Materials/Background/babylon.backgroundMaterial.ts

@@ -83,7 +83,6 @@
         public SAMPLER3DBGRMAP = false;
         public SAMPLER3DBGRMAP = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public EXPOSURE = false;
         public EXPOSURE = false;
-        public GRAIN = false;
 
 
         // Reflection.
         // Reflection.
         public REFLECTION = false;
         public REFLECTION = false;
@@ -355,7 +354,6 @@
 
 
         /**
         /**
          * Enable the FOV adjustment feature controlled by fovMultiplier.
          * Enable the FOV adjustment feature controlled by fovMultiplier.
-         * @type {boolean}
          */
          */
         public useEquirectangularFOV: boolean = false;
         public useEquirectangularFOV: boolean = false;
 
 

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

@@ -120,7 +120,6 @@
         public SAMPLER3DBGRMAP = false;
         public SAMPLER3DBGRMAP = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public EXPOSURE = false;
         public EXPOSURE = false;
-        public GRAIN = false;
 
 
         public USEPHYSICALLIGHTFALLOFF = false;
         public USEPHYSICALLIGHTFALLOFF = false;
         public TWOSIDEDLIGHTING = false;
         public TWOSIDEDLIGHTING = false;

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

@@ -137,7 +137,6 @@
 
 
         /**
         /**
         * An event triggered when the texture is disposed.
         * An event triggered when the texture is disposed.
-        * @type {BABYLON.Observable}
         */
         */
         public onDisposeObservable = new Observable<BaseTexture>();
         public onDisposeObservable = new Observable<BaseTexture>();
 
 

+ 53 - 0
src/Materials/Textures/babylon.dynamicTexture.ts

@@ -1,10 +1,24 @@
 module BABYLON {
 module BABYLON {
+    /**
+     * A class extending {BABYLON.Texture} allowing drawing on a texture
+     * @see http://doc.babylonjs.com/how_to/dynamictexture
+     */
     export class DynamicTexture extends Texture {
     export class DynamicTexture extends Texture {
         private _generateMipMaps: boolean;
         private _generateMipMaps: boolean;
         private _canvas: HTMLCanvasElement;
         private _canvas: HTMLCanvasElement;
         private _context: CanvasRenderingContext2D;
         private _context: CanvasRenderingContext2D;
         private _engine: Engine;
         private _engine: Engine;
 
 
+        /**
+         * Creates a {BABYLON.DynamicTexture}
+         * @param name defines the name of the texture
+         * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height
+         * @param scene defines the scene where you want the texture
+         * @param generateMipMaps defines the use of MinMaps or not (default is false)
+         * @param samplingMode defines the sampling mode to use (default is BABYLON.Texture.TRILINEAR_SAMPLINGMODE)
+         * @param format defines the texture format to use (default is BABYLON.Engine.TEXTUREFORMAT_RGBA)
+         */
+
         constructor(name: string, options: any, scene: Nullable<Scene> = null, generateMipMaps: boolean, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, format: number = Engine.TEXTUREFORMAT_RGBA) {
         constructor(name: string, options: any, scene: Nullable<Scene> = null, generateMipMaps: boolean, samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE, format: number = Engine.TEXTUREFORMAT_RGBA) {
             super(null, scene, !generateMipMaps, undefined, samplingMode, undefined, undefined, undefined, undefined, format);
             super(null, scene, !generateMipMaps, undefined, samplingMode, undefined, undefined, undefined, undefined, format);
 
 
@@ -35,6 +49,9 @@
             this._context = <CanvasRenderingContext2D>this._canvas.getContext("2d");
             this._context = <CanvasRenderingContext2D>this._canvas.getContext("2d");
         }
         }
 
 
+        /**
+         * Gets the current state of canRescale
+         */
         public get canRescale(): boolean {
         public get canRescale(): boolean {
             return true;
             return true;
         }
         }
@@ -48,6 +65,10 @@
             this._texture = this._engine.createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this._samplingMode);
             this._texture = this._engine.createDynamicTexture(textureSize.width, textureSize.height, this._generateMipMaps, this._samplingMode);
         }
         }
 
 
+        /**
+         * Scales the texture
+         * @param ratio the scale factor to apply to both width and height
+         */
         public scale(ratio: number): void {
         public scale(ratio: number): void {
             var textureSize = this.getSize();
             var textureSize = this.getSize();
 
 
@@ -57,6 +78,11 @@
             this._recreate(textureSize);
             this._recreate(textureSize);
         }
         }
 
 
+        /**
+         * Resizes the texture
+         * @param width the new width
+         * @param height the new height
+         */
         public scaleTo(width: number, height: number): void {
         public scaleTo(width: number, height: number): void {
             var textureSize = this.getSize();
             var textureSize = this.getSize();
 
 
@@ -66,19 +92,41 @@
             this._recreate(textureSize);
             this._recreate(textureSize);
         }
         }
 
 
+        /**
+         * Gets the context of the canvas used by the texture
+         * @returns the canvas context of the dynamic texture
+         */
         public getContext(): CanvasRenderingContext2D {
         public getContext(): CanvasRenderingContext2D {
             return this._context;
             return this._context;
         }
         }
 
 
+        /**
+         * Clears the texture
+         */
         public clear(): void {
         public clear(): void {
             var size = this.getSize();
             var size = this.getSize();
             this._context.fillRect(0, 0, size.width, size.height);
             this._context.fillRect(0, 0, size.width, size.height);
         }
         }
 
 
+        /**
+         * Updates the texture
+         * @param invertY defines the direction for the Y axis (default is true - y increases downwards)
+         */
         public update(invertY?: boolean): void {
         public update(invertY?: boolean): void {
             this._engine.updateDynamicTexture(this._texture, this._canvas, invertY === undefined ? true : invertY, undefined, this._format || undefined);
             this._engine.updateDynamicTexture(this._texture, this._canvas, invertY === undefined ? true : invertY, undefined, this._format || undefined);
         }
         }
 
 
+        /**
+         * Draws text onto the texture
+         * @param text defines the text to be drawn
+         * @param x defines the placement of the text from the left
+         * @param y defines the placement of the text from the top when invertY is true and from the bottom when false
+         * @param font defines the font to be used with font-style, font-size, font-name 
+         * @param color defines the color used for the text
+         * @param clearColor defines the color for the canvas, use null to not overwrite canvas 
+         * @param invertY defines the direction for the Y axis (default is true - y increases downwards)
+         * @param update defines whether texture is immediately update (default is true)  
+         */
         public drawText(text: string, x: number, y: number, font: string, color: string, clearColor: string, invertY?: boolean, update = true) {
         public drawText(text: string, x: number, y: number, font: string, color: string, clearColor: string, invertY?: boolean, update = true) {
             var size = this.getSize();
             var size = this.getSize();
             if (clearColor) {
             if (clearColor) {
@@ -104,6 +152,10 @@
             }
             }
         }
         }
 
 
+        /**
+         * Clones the texture
+         * @returns the clone of the texture.
+         */
         public clone(): DynamicTexture {
         public clone(): DynamicTexture {
             let scene = this.getScene();
             let scene = this.getScene();
 
 
@@ -125,6 +177,7 @@
             return newTexture;
             return newTexture;
         }
         }
 
 
+        /** @ignore */
         public _rebuild(): void {
         public _rebuild(): void {
             this.update();
             this.update();
         }
         }

+ 0 - 5
src/Materials/Textures/babylon.renderTargetTexture.ts

@@ -43,13 +43,11 @@
 
 
         /**
         /**
         * An event triggered when the texture is unbind.
         * An event triggered when the texture is unbind.
-        * @type {BABYLON.Observable}
         */
         */
         public onBeforeBindObservable = new Observable<RenderTargetTexture>();
         public onBeforeBindObservable = new Observable<RenderTargetTexture>();
 
 
         /**
         /**
         * An event triggered when the texture is unbind.
         * An event triggered when the texture is unbind.
-        * @type {BABYLON.Observable}
         */
         */
         public onAfterUnbindObservable = new Observable<RenderTargetTexture>();
         public onAfterUnbindObservable = new Observable<RenderTargetTexture>();
 
 
@@ -63,7 +61,6 @@
 
 
         /**
         /**
         * An event triggered before rendering the texture
         * An event triggered before rendering the texture
-        * @type {BABYLON.Observable}
         */
         */
         public onBeforeRenderObservable = new Observable<number>();
         public onBeforeRenderObservable = new Observable<number>();
 
 
@@ -77,7 +74,6 @@
 
 
         /**
         /**
         * An event triggered after rendering the texture
         * An event triggered after rendering the texture
-        * @type {BABYLON.Observable}
         */
         */
         public onAfterRenderObservable = new Observable<number>();
         public onAfterRenderObservable = new Observable<number>();
 
 
@@ -91,7 +87,6 @@
 
 
         /**
         /**
         * An event triggered after the texture clear
         * An event triggered after the texture clear
-        * @type {BABYLON.Observable}
         */
         */
         public onClearObservable = new Observable<Engine>();
         public onClearObservable = new Observable<Engine>();
 
 

+ 2 - 2
src/Materials/babylon.effect.ts

@@ -258,7 +258,7 @@
 
 
                 this._attributesNames = options.attributes;
                 this._attributesNames = options.attributes;
                 this._uniformsNames = options.uniformsNames.concat(options.samplers);
                 this._uniformsNames = options.uniformsNames.concat(options.samplers);
-                this._samplers = options.samplers;
+                this._samplers = options.samplers.slice();
                 this.defines = options.defines;
                 this.defines = options.defines;
                 this.onError = options.onError;
                 this.onError = options.onError;
                 this.onCompiled = options.onCompiled;
                 this.onCompiled = options.onCompiled;
@@ -275,7 +275,7 @@
                 this._engine = <Engine>engine;
                 this._engine = <Engine>engine;
                 this.defines = <string>defines;
                 this.defines = <string>defines;
                 this._uniformsNames = (<string[]>uniformsNamesOrEngine).concat(<string[]>samplers);
                 this._uniformsNames = (<string[]>uniformsNamesOrEngine).concat(<string[]>samplers);
-                this._samplers = <string[]>samplers;
+                this._samplers = samplers ? <string[]>samplers.slice() : [];
                 this._attributesNames = (<string[]>attributesNamesOrOptions);
                 this._attributesNames = (<string[]>attributesNamesOrOptions);
 
 
                 this.onError = onError;
                 this.onError = onError;

+ 1 - 65
src/Materials/babylon.imageProcessingConfiguration.ts

@@ -18,10 +18,6 @@ module BABYLON {
         SAMPLER3DGREENDEPTH: boolean;
         SAMPLER3DGREENDEPTH: boolean;
         SAMPLER3DBGRMAP: boolean;
         SAMPLER3DBGRMAP: boolean;
         IMAGEPROCESSINGPOSTPROCESS: boolean;
         IMAGEPROCESSINGPOSTPROCESS: boolean;
-        /** 
-         * If the grain should be performed in the image processing shader.
-         */
-        GRAIN: boolean;
     }
     }
 
 
     /**
     /**
@@ -221,57 +217,6 @@ module BABYLON {
         public vignetteCameraFov = 0.5;
         public vignetteCameraFov = 0.5;
 
 
         @serialize()
         @serialize()
-        private _grainEnabled = false;
-
-        /**
-         * If the grain effect should be enabled.
-         */
-        public get grainEnabled(): boolean {
-            return this._grainEnabled;
-        }
-        public set grainEnabled(value: boolean) {
-            if (this._grainEnabled === value) {
-                return;
-            }
-
-            this._grainEnabled = value;
-            this._updateParameters();
-        }
-
-        @serialize()
-        private _grainIntensity = 30;
-        /**
-         * Amount of grain to be applied by the grain effect.
-         */
-        public get grainIntensity(): number {
-            return this._grainIntensity;
-        }
-        public set grainIntensity(value: number) {
-            if (this._grainIntensity === value) {
-                return;
-            }
-            this._grainIntensity = value;
-        }
-
-        @serialize()
-        private _grainAnimated = false;
-
-        /**
-         * If the grain effect should be animated.
-         */
-        public get grainAnimated(): boolean {
-            return this._grainAnimated;
-        }
-        public set grainAnimated(value: boolean) {
-            if (this._grainAnimated === value) {
-                return;
-            }
-
-            this._grainAnimated = value;
-            this._updateParameters();
-        }
-
-        @serialize()
         private _vignetteBlendMode = ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;
         private _vignetteBlendMode = ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;
         /**
         /**
          * Gets the vignette blend mode allowing different kind of effect.
          * Gets the vignette blend mode allowing different kind of effect.
@@ -353,7 +298,6 @@ module BABYLON {
 
 
         /**
         /**
         * An event triggered when the configuration changes and requires Shader to Update some parameters.
         * An event triggered when the configuration changes and requires Shader to Update some parameters.
-        * @type {BABYLON.Observable}
         */
         */
         public onUpdateParameters = new Observable<ImageProcessingConfiguration>();
         public onUpdateParameters = new Observable<ImageProcessingConfiguration>();
 
 
@@ -391,10 +335,6 @@ module BABYLON {
             if (defines.COLORCURVES) {
             if (defines.COLORCURVES) {
                 ColorCurves.PrepareUniforms(uniforms);
                 ColorCurves.PrepareUniforms(uniforms);
             }
             }
-            if (defines.GRAIN){
-                uniforms.push("grainVarianceAmount");
-                uniforms.push("grainAnimatedSeed");
-            }
         }
         }
 
 
         /**
         /**
@@ -442,8 +382,7 @@ module BABYLON {
             defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth;
             defines.SAMPLER3DGREENDEPTH = this.colorGradingWithGreenDepth;
             defines.SAMPLER3DBGRMAP = this.colorGradingBGR;
             defines.SAMPLER3DBGRMAP = this.colorGradingBGR;
             defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess;
             defines.IMAGEPROCESSINGPOSTPROCESS = this.applyByPostProcess;
-            defines.GRAIN = this.grainEnabled;
-            defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING || defines.GRAIN;
+            defines.IMAGEPROCESSING = defines.VIGNETTE || defines.TONEMAPPING || defines.CONTRAST || defines.EXPOSURE || defines.COLORCURVES || defines.COLORGRADING;
         }
         }
 
 
         /**
         /**
@@ -501,9 +440,6 @@ module BABYLON {
                     this.colorGradingTexture.level // weight
                     this.colorGradingTexture.level // weight
                 );
                 );
             }
             }
-
-            effect.setFloat("grainVarianceAmount", this.grainIntensity);
-            effect.setFloat("grainAnimatedSeed", this.grainAnimated ? Math.random() + 1 : 1);
         }
         }
 
 
         /**
         /**

+ 15 - 5
src/Materials/babylon.material.ts

@@ -493,13 +493,11 @@
 
 
         /**
         /**
         * An event triggered when the material is disposed.
         * An event triggered when the material is disposed.
-        * @type {BABYLON.Observable}
         */
         */
         public onDisposeObservable = new Observable<Material>();
         public onDisposeObservable = new Observable<Material>();
 
 
         /**
         /**
          * An observer which watches for dispose events.
          * An observer which watches for dispose events.
-         * @type {BABYLON.Observer}
          */
          */
         private _onDisposeObserver: Nullable<Observer<Material>>;
         private _onDisposeObserver: Nullable<Observer<Material>>;
 
 
@@ -515,13 +513,11 @@
 
 
         /**
         /**
         * An event triggered when the material is bound.
         * An event triggered when the material is bound.
-        * @type {BABYLON.Observable}
         */
         */
         public onBindObservable = new Observable<AbstractMesh>();
         public onBindObservable = new Observable<AbstractMesh>();
 
 
         /**
         /**
          * An observer which watches for bind events.
          * An observer which watches for bind events.
-         * @type {BABYLON.Observer}
          */
          */
         private _onBindObserver: Nullable<Observer<AbstractMesh>>;
         private _onBindObserver: Nullable<Observer<AbstractMesh>>;
 
 
@@ -537,7 +533,6 @@
 
 
         /**
         /**
         * An event triggered when the material is unbound.
         * An event triggered when the material is unbound.
-        * @type {BABYLON.Observable}
         */
         */
         public onUnBindObservable = new Observable<Material>();
         public onUnBindObservable = new Observable<Material>();
 
 
@@ -549,6 +544,21 @@
 
 
         /**
         /**
          * Sets the value of the alpha mode.
          * Sets the value of the alpha mode.
+         *
+         * | Value | Type | Description |
+         * | --- | --- | --- |
+         * | 0 | ALPHA_DISABLE |   |
+         * | 1 | ALPHA_ADD |   |
+         * | 2 | ALPHA_COMBINE |   |
+         * | 3 | ALPHA_SUBTRACT |   |
+         * | 4 | ALPHA_MULTIPLY |   |
+         * | 5 | ALPHA_MAXIMIZED |   |
+         * | 6 | ALPHA_ONEONE |   |
+         * | 7 | ALPHA_PREMULTIPLIED |   |
+         * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF |   |
+         * | 9 | ALPHA_INTERPOLATE |   |
+         * | 10 | ALPHA_SCREENMODE |   |
+         *
          */
          */
         public set alphaMode(value: number) {
         public set alphaMode(value: number) {
             if (this._alphaMode === value) {
             if (this._alphaMode === value) {

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

@@ -88,7 +88,6 @@ module BABYLON {
         public SAMPLER3DBGRMAP = false;
         public SAMPLER3DBGRMAP = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public IMAGEPROCESSINGPOSTPROCESS = false;
         public EXPOSURE = false;
         public EXPOSURE = false;
-        public GRAIN = false;
 
 
         constructor() {
         constructor() {
             super();
             super();

+ 0 - 4
src/Mesh/babylon.abstractMesh.ts

@@ -118,7 +118,6 @@
 
 
         /**
         /**
         * An event triggered when this mesh collides with another one
         * An event triggered when this mesh collides with another one
-        * @type {BABYLON.Observable}
         */
         */
         public onCollideObservable = new Observable<AbstractMesh>();
         public onCollideObservable = new Observable<AbstractMesh>();
 
 
@@ -132,7 +131,6 @@
 
 
         /**
         /**
         * An event triggered when the collision's position changes
         * An event triggered when the collision's position changes
-        * @type {BABYLON.Observable}
         */
         */
         public onCollisionPositionChangeObservable = new Observable<Vector3>();
         public onCollisionPositionChangeObservable = new Observable<Vector3>();
 
 
@@ -146,7 +144,6 @@
 
 
         /**
         /**
         * An event triggered when material is changed
         * An event triggered when material is changed
-        * @type {BABYLON.Observable}
         */
         */
         public onMaterialChangedObservable = new Observable<AbstractMesh>();
         public onMaterialChangedObservable = new Observable<AbstractMesh>();
 
 
@@ -367,7 +364,6 @@
 
 
         /**
         /**
          * This scene's action manager
          * This scene's action manager
-         * @type {BABYLON.ActionManager}
         */
         */
         public actionManager: Nullable<ActionManager> = null;
         public actionManager: Nullable<ActionManager> = null;
 
 

+ 0 - 3
src/Mesh/babylon.mesh.ts

@@ -68,19 +68,16 @@
 
 
         /**
         /**
          * An event triggered before rendering the mesh
          * An event triggered before rendering the mesh
-         * @type {BABYLON.Observable}
          */
          */
         public onBeforeRenderObservable = new Observable<Mesh>();
         public onBeforeRenderObservable = new Observable<Mesh>();
 
 
         /**
         /**
         * An event triggered after rendering the mesh
         * An event triggered after rendering the mesh
-        * @type {BABYLON.Observable}
         */
         */
         public onAfterRenderObservable = new Observable<Mesh>();
         public onAfterRenderObservable = new Observable<Mesh>();
 
 
         /**
         /**
         * An event triggered before drawing the mesh
         * An event triggered before drawing the mesh
-        * @type {BABYLON.Observable}
         */
         */
         public onBeforeDrawObservable = new Observable<Mesh>();
         public onBeforeDrawObservable = new Observable<Mesh>();
 
 

+ 6 - 1
src/Mesh/babylon.polygonMesh.ts

@@ -1,4 +1,5 @@
 module BABYLON {
 module BABYLON {
+    declare var earcut: any;
     class IndexedVector2 extends Vector2 {
     class IndexedVector2 extends Vector2 {
         constructor(original: Vector2, public index: number) {
         constructor(original: Vector2, public index: number) {
             super(original.x, original.y);
             super(original.x, original.y);
@@ -131,6 +132,10 @@ module BABYLON {
 
 
             this._points.add(points);
             this._points.add(points);
             this._outlinepoints.add(points);
             this._outlinepoints.add(points);
+
+            if (typeof earcut === 'undefined') {
+                Tools.Warn("Earcut was not found, the polygon will not be built.")
+            }
         }
         }
 
 
         addHole(hole: Vector2[]): PolygonMeshBuilder {
         addHole(hole: Vector2[]): PolygonMeshBuilder {
@@ -161,7 +166,7 @@ module BABYLON {
 
 
             var indices = new Array<number>();
             var indices = new Array<number>();
 
 
-            let res = Earcut.earcut(this._epoints, this._eholes, 2);
+            let res = earcut(this._epoints, this._eholes, 2);
 
 
             for (let i = 0; i < res.length; i++) {
             for (let i = 0; i < res.length; i++) {
                 indices.push(res[i]);
                 indices.push(res[i]);

+ 63 - 26
src/Mesh/babylon.transformNode.ts

@@ -6,6 +6,12 @@ module BABYLON {
         public static BILLBOARDMODE_Y = 2;
         public static BILLBOARDMODE_Y = 2;
         public static BILLBOARDMODE_Z = 4;
         public static BILLBOARDMODE_Z = 4;
         public static BILLBOARDMODE_ALL = 7;
         public static BILLBOARDMODE_ALL = 7;
+        
+        private _forward = new Vector3(0, 0, 1);
+        private _forwardInverted = new Vector3(0, 0, -1);
+        private _up = new Vector3(0, 1, 0);
+        private _right = new Vector3(1, 0, 0);
+        private _rightInverted = new Vector3(-1, 0, 0);
 
 
         // Properties
         // Properties
         @serializeAsVector3()
         @serializeAsVector3()
@@ -20,7 +26,7 @@ module BABYLON {
         private _transformToBoneReferal: Nullable<TransformNode>;
         private _transformToBoneReferal: Nullable<TransformNode>;
 
 
         @serialize()
         @serialize()
-        public billboardMode = AbstractMesh.BILLBOARDMODE_NONE;
+        public billboardMode = TransformNode.BILLBOARDMODE_NONE;
 
 
         @serialize()
         @serialize()
         public scalingDeterminant = 1;
         public scalingDeterminant = 1;
@@ -45,7 +51,6 @@ module BABYLON {
 
 
         /**
         /**
         * An event triggered after the world matrix is updated
         * An event triggered after the world matrix is updated
-        * @type {BABYLON.Observable}
         */
         */
         public onAfterWorldMatrixUpdateObservable = new Observable<TransformNode>();
         public onAfterWorldMatrixUpdateObservable = new Observable<TransformNode>();
 
 
@@ -112,6 +117,36 @@ module BABYLON {
         }
         }
 
 
         /**
         /**
+         * The forward direction of that transform in world space.
+         */
+        public get forward(): Vector3 {
+            return Vector3.Normalize(Vector3.TransformNormal(
+                this.getScene().useRightHandedSystem ? this._forwardInverted : this._forward,
+                this.getWorldMatrix()
+            ));
+        }
+
+        /**
+         * The up direction of that transform in world space.
+         */
+        public get up(): Vector3 {
+            return Vector3.Normalize(Vector3.TransformNormal(
+                this._up,
+                this.getWorldMatrix()
+            ));
+        }
+
+        /**
+         * The right direction of that transform in world space.
+         */
+        public get right(): Vector3 {
+            return Vector3.Normalize(Vector3.TransformNormal(
+                this.getScene().useRightHandedSystem ? this._rightInverted : this._right,
+                this.getWorldMatrix()
+            ));
+        }
+
+        /**
          * Returns the latest update of the World matrix
          * Returns the latest update of the World matrix
          * Returns a Matrix.  
          * Returns a Matrix.  
          */
          */
@@ -139,7 +174,7 @@ module BABYLON {
 
 
         /**
         /**
          * Copies the paramater passed Matrix into the mesh Pose matrix.  
          * Copies the paramater passed Matrix into the mesh Pose matrix.  
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public updatePoseMatrix(matrix: Matrix): TransformNode {
         public updatePoseMatrix(matrix: Matrix): TransformNode {
             this._poseMatrix.copyFrom(matrix);
             this._poseMatrix.copyFrom(matrix);
@@ -159,7 +194,7 @@ module BABYLON {
                 return false;
                 return false;
             }
             }
 
 
-            if (this.billboardMode !== this._cache.billboardMode || this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE)
+            if (this.billboardMode !== this._cache.billboardMode || this.billboardMode !== TransformNode.BILLBOARDMODE_NONE)
                 return false;
                 return false;
 
 
             if (this._cache.pivotMatrixUpdated) {
             if (this._cache.pivotMatrixUpdated) {
@@ -257,7 +292,7 @@ module BABYLON {
 
 
         /**
         /**
          * Prevents the World matrix to be computed any longer.
          * Prevents the World matrix to be computed any longer.
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public freezeWorldMatrix(): TransformNode {
         public freezeWorldMatrix(): TransformNode {
             this._isWorldMatrixFrozen = false;  // no guarantee world is not already frozen, switch off temporarily
             this._isWorldMatrixFrozen = false;  // no guarantee world is not already frozen, switch off temporarily
@@ -268,7 +303,7 @@ module BABYLON {
 
 
         /**
         /**
          * Allows back the World matrix computation. 
          * Allows back the World matrix computation. 
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public unfreezeWorldMatrix() {
         public unfreezeWorldMatrix() {
             this._isWorldMatrixFrozen = false;
             this._isWorldMatrixFrozen = false;
@@ -295,7 +330,7 @@ module BABYLON {
 
 
         /**
         /**
          * Sets the mesh absolute position in the World from a Vector3 or an Array(3).
          * Sets the mesh absolute position in the World from a Vector3 or an Array(3).
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public setAbsolutePosition(absolutePosition: Vector3): TransformNode {
         public setAbsolutePosition(absolutePosition: Vector3): TransformNode {
             if (!absolutePosition) {
             if (!absolutePosition) {
@@ -332,7 +367,7 @@ module BABYLON {
 
 
         /**
         /**
            * Sets the mesh position in its local space.  
            * Sets the mesh position in its local space.  
-           * Returns the AbstractMesh.  
+           * Returns the TransformNode.  
            */
            */
         public setPositionWithLocalVector(vector3: Vector3): TransformNode {
         public setPositionWithLocalVector(vector3: Vector3): TransformNode {
             this.computeWorldMatrix();
             this.computeWorldMatrix();
@@ -354,7 +389,7 @@ module BABYLON {
 
 
         /**
         /**
          * Translates the mesh along the passed Vector3 in its local space.  
          * Translates the mesh along the passed Vector3 in its local space.  
-         * Returns the AbstractMesh. 
+         * Returns the TransformNode. 
          */
          */
         public locallyTranslate(vector3: Vector3): TransformNode {
         public locallyTranslate(vector3: Vector3): TransformNode {
             this.computeWorldMatrix(true);
             this.computeWorldMatrix(true);
@@ -374,7 +409,7 @@ module BABYLON {
          * @returns the TransformNode. 
          * @returns the TransformNode. 
          */
          */
         public lookAt(targetPoint: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0, space: Space = Space.LOCAL): TransformNode {
         public lookAt(targetPoint: Vector3, yawCor: number = 0, pitchCor: number = 0, rollCor: number = 0, space: Space = Space.LOCAL): TransformNode {
-            var dv = AbstractMesh._lookAtVectorCache;
+            var dv = TransformNode._lookAtVectorCache;
             var pos = space === Space.LOCAL ? this.position : this.getAbsolutePosition();
             var pos = space === Space.LOCAL ? this.position : this.getAbsolutePosition();
             targetPoint.subtractToRef(pos, dv);
             targetPoint.subtractToRef(pos, dv);
             var yaw = -Math.atan2(dv.z, dv.x) - Math.PI / 2;
             var yaw = -Math.atan2(dv.z, dv.x) - Math.PI / 2;
@@ -407,7 +442,7 @@ module BABYLON {
          * Sets the Vector3 "result" as the rotated Vector3 "localAxis" in the same rotation than the mesh.
          * Sets the Vector3 "result" as the rotated Vector3 "localAxis" in the same rotation than the mesh.
          * localAxis is expressed in the mesh local space.
          * localAxis is expressed in the mesh local space.
          * result is computed in the Wordl space from the mesh World matrix.  
          * result is computed in the Wordl space from the mesh World matrix.  
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public getDirectionToRef(localAxis: Vector3, result: Vector3): TransformNode {
         public getDirectionToRef(localAxis: Vector3, result: Vector3): TransformNode {
             Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);
             Vector3.TransformNormalToRef(localAxis, this.getWorldMatrix(), result);
@@ -447,7 +482,7 @@ module BABYLON {
 
 
         /**
         /**
          * Sets the passed Vector3 "result" with the coordinates of the mesh pivot point in the local space.   
          * Sets the passed Vector3 "result" with the coordinates of the mesh pivot point in the local space.   
-         * Returns the AbstractMesh.   
+         * Returns the TransformNode.   
          */
          */
         public getPivotPointToRef(result: Vector3): TransformNode {
         public getPivotPointToRef(result: Vector3): TransformNode {
             result.x = -this._pivotMatrix.m[12];
             result.x = -this._pivotMatrix.m[12];
@@ -467,7 +502,7 @@ module BABYLON {
 
 
         /**
         /**
          * Sets the Vector3 "result" coordinates with the mesh pivot point World coordinates.  
          * Sets the Vector3 "result" coordinates with the mesh pivot point World coordinates.  
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public getAbsolutePivotPointToRef(result: Vector3): TransformNode {
         public getAbsolutePivotPointToRef(result: Vector3): TransformNode {
             result.x = this._pivotMatrix.m[12];
             result.x = this._pivotMatrix.m[12];
@@ -590,7 +625,7 @@ module BABYLON {
          * space (default LOCAL) can be either BABYLON.Space.LOCAL, either BABYLON.Space.WORLD.
          * space (default LOCAL) can be either BABYLON.Space.LOCAL, either BABYLON.Space.WORLD.
          * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.  
          * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.  
          * The passed axis is also normalized.  
          * The passed axis is also normalized.  
-         * Returns the AbstractMesh.
+         * Returns the TransformNode.
          */
          */
         public rotate(axis: Vector3, amount: number, space?: Space): TransformNode {
         public rotate(axis: Vector3, amount: number, space?: Space): TransformNode {
             axis.normalize();
             axis.normalize();
@@ -600,7 +635,7 @@ module BABYLON {
             }
             }
             var rotationQuaternion: Quaternion;
             var rotationQuaternion: Quaternion;
             if (!space || (space as any) === Space.LOCAL) {
             if (!space || (space as any) === Space.LOCAL) {
-                rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, AbstractMesh._rotationAxisCache);
+                rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._rotationAxisCache);
                 this.rotationQuaternion.multiplyToRef(rotationQuaternion, this.rotationQuaternion);
                 this.rotationQuaternion.multiplyToRef(rotationQuaternion, this.rotationQuaternion);
             }
             }
             else {
             else {
@@ -609,7 +644,7 @@ module BABYLON {
                     invertParentWorldMatrix.invert();
                     invertParentWorldMatrix.invert();
                     axis = Vector3.TransformNormal(axis, invertParentWorldMatrix);
                     axis = Vector3.TransformNormal(axis, invertParentWorldMatrix);
                 }
                 }
-                rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, AbstractMesh._rotationAxisCache);
+                rotationQuaternion = Quaternion.RotationAxisToRef(axis, amount, TransformNode._rotationAxisCache);
                 rotationQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);
                 rotationQuaternion.multiplyToRef(this.rotationQuaternion, this.rotationQuaternion);
             }
             }
             return this;
             return this;
@@ -619,7 +654,7 @@ module BABYLON {
          * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.  
          * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.  
          * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.  
          * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.  
          * The passed axis is also normalized.  
          * The passed axis is also normalized.  
-         * Returns the AbstractMesh.
+         * Returns the TransformNode.
          * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm
          * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm
          */
          */
         public rotateAround(point: Vector3, axis: Vector3, amount: number): TransformNode {
         public rotateAround(point: Vector3, axis: Vector3, amount: number): TransformNode {
@@ -646,7 +681,7 @@ module BABYLON {
         /**
         /**
          * Translates the mesh along the axis vector for the passed distance in the given space.  
          * Translates the mesh along the axis vector for the passed distance in the given space.  
          * space (default LOCAL) can be either BABYLON.Space.LOCAL, either BABYLON.Space.WORLD.
          * space (default LOCAL) can be either BABYLON.Space.LOCAL, either BABYLON.Space.WORLD.
-         * Returns the AbstractMesh.
+         * Returns the TransformNode.
          */
          */
         public translate(axis: Vector3, distance: number, space?: Space): TransformNode {
         public translate(axis: Vector3, distance: number, space?: Space): TransformNode {
             var displacementVector = axis.scale(distance);
             var displacementVector = axis.scale(distance);
@@ -672,7 +707,7 @@ module BABYLON {
          * ```
          * ```
          * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.  
          * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.  
          * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.   
          * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.   
-         * Returns the AbstractMesh.  
+         * Returns the TransformNode.  
          */
          */
         public addRotation(x: number, y: number, z: number): TransformNode {
         public addRotation(x: number, y: number, z: number): TransformNode {
             var rotationQuaternion;
             var rotationQuaternion;
@@ -705,6 +740,7 @@ module BABYLON {
             }
             }
 
 
             if (!force && this.isSynchronized(true)) {
             if (!force && this.isSynchronized(true)) {
+                this._currentRenderId = this.getScene().getRenderId();
                 return this._worldMatrix;
                 return this._worldMatrix;
             }
             }
 
 
@@ -713,6 +749,7 @@ module BABYLON {
             this._cache.pivotMatrixUpdated = false;
             this._cache.pivotMatrixUpdated = false;
             this._cache.billboardMode = this.billboardMode;
             this._cache.billboardMode = this.billboardMode;
             this._currentRenderId = this.getScene().getRenderId();
             this._currentRenderId = this.getScene().getRenderId();
+            this._childRenderId = this.getScene().getRenderId();
             this._isDirty = false;
             this._isDirty = false;
 
 
             // Scaling
             // Scaling
@@ -757,8 +794,8 @@ module BABYLON {
             Tmp.Matrix[4].multiplyToRef(Tmp.Matrix[0], Tmp.Matrix[5]);
             Tmp.Matrix[4].multiplyToRef(Tmp.Matrix[0], Tmp.Matrix[5]);
 
 
             // Billboarding (testing PG:http://www.babylonjs-playground.com/#UJEIL#13)
             // Billboarding (testing PG:http://www.babylonjs-playground.com/#UJEIL#13)
-            if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE && camera) {
-                if ((this.billboardMode & AbstractMesh.BILLBOARDMODE_ALL) !== AbstractMesh.BILLBOARDMODE_ALL) {
+            if (this.billboardMode !== TransformNode.BILLBOARDMODE_NONE && camera) {
+                if ((this.billboardMode & TransformNode.BILLBOARDMODE_ALL) !== TransformNode.BILLBOARDMODE_ALL) {
                     // Need to decompose each rotation here
                     // Need to decompose each rotation here
                     var currentPosition = Tmp.Vector3[3];
                     var currentPosition = Tmp.Vector3[3];
 
 
@@ -776,15 +813,15 @@ module BABYLON {
                     currentPosition.subtractInPlace(camera.globalPosition);
                     currentPosition.subtractInPlace(camera.globalPosition);
 
 
                     var finalEuler = Tmp.Vector3[4].copyFromFloats(0, 0, 0);
                     var finalEuler = Tmp.Vector3[4].copyFromFloats(0, 0, 0);
-                    if ((this.billboardMode & AbstractMesh.BILLBOARDMODE_X) === AbstractMesh.BILLBOARDMODE_X) {
+                    if ((this.billboardMode & TransformNode.BILLBOARDMODE_X) === TransformNode.BILLBOARDMODE_X) {
                         finalEuler.x = Math.atan2(-currentPosition.y, currentPosition.z);
                         finalEuler.x = Math.atan2(-currentPosition.y, currentPosition.z);
                     }
                     }
 
 
-                    if ((this.billboardMode & AbstractMesh.BILLBOARDMODE_Y) === AbstractMesh.BILLBOARDMODE_Y) {
+                    if ((this.billboardMode & TransformNode.BILLBOARDMODE_Y) === TransformNode.BILLBOARDMODE_Y) {
                         finalEuler.y = Math.atan2(currentPosition.x, currentPosition.z);
                         finalEuler.y = Math.atan2(currentPosition.x, currentPosition.z);
                     }
                     }
 
 
-                    if ((this.billboardMode & AbstractMesh.BILLBOARDMODE_Z) === AbstractMesh.BILLBOARDMODE_Z) {
+                    if ((this.billboardMode & TransformNode.BILLBOARDMODE_Z) === TransformNode.BILLBOARDMODE_Z) {
                         finalEuler.z = Math.atan2(currentPosition.y, currentPosition.x);
                         finalEuler.z = Math.atan2(currentPosition.y, currentPosition.x);
                     }
                     }
 
 
@@ -805,7 +842,7 @@ module BABYLON {
 
 
             // Parent
             // Parent
             if (this.parent && this.parent.getWorldMatrix) {
             if (this.parent && this.parent.getWorldMatrix) {
-                if (this.billboardMode !== AbstractMesh.BILLBOARDMODE_NONE) {
+                if (this.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {
                     if (this._transformToBoneReferal) {
                     if (this._transformToBoneReferal) {
                         this.parent.getWorldMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), Tmp.Matrix[6]);
                         this.parent.getWorldMatrix().multiplyToRef(this._transformToBoneReferal.getWorldMatrix(), Tmp.Matrix[6]);
                         Tmp.Matrix[5].copyFrom(Tmp.Matrix[6]);
                         Tmp.Matrix[5].copyFrom(Tmp.Matrix[6]);
@@ -990,4 +1027,4 @@ module BABYLON {
         }
         }
 
 
     }
     }
-}
+}

+ 1 - 1
src/Particles/EmitterTypes/babylon.boxParticleEmitter.ts

@@ -24,7 +24,7 @@ module BABYLON {
         public maxEmitBox = new Vector3(0.5, 0.5, 0.5);  
         public maxEmitBox = new Vector3(0.5, 0.5, 0.5);  
                
                
         /**
         /**
-         * Creates a new instance of @see BoxParticleEmitter
+         * Creates a new instance BoxParticleEmitter
          */
          */
         constructor() {
         constructor() {
 
 

+ 1 - 1
src/Particles/EmitterTypes/babylon.coneParticleEmitter.ts

@@ -29,7 +29,7 @@ module BABYLON {
         }
         }
 
 
         /**
         /**
-         * Creates a new instance of @see ConeParticleEmitter
+         * Creates a new instance ConeParticleEmitter
          * @param radius the radius of the emission cone (1 by default)
          * @param radius the radius of the emission cone (1 by default)
          * @param angles the cone base angle (PI by default)
          * @param angles the cone base angle (PI by default)
          * @param directionRandomizer defines how much to randomize the particle direction [0-1]
          * @param directionRandomizer defines how much to randomize the particle direction [0-1]

+ 2 - 2
src/Particles/EmitterTypes/babylon.sphereParticleEmitter.ts

@@ -6,7 +6,7 @@ module BABYLON {
     export class SphereParticleEmitter implements IParticleEmitterType {
     export class SphereParticleEmitter implements IParticleEmitterType {
 
 
         /**
         /**
-         * Creates a new instance of @see SphereParticleEmitter
+         * Creates a new instance SphereParticleEmitter
          * @param radius the radius of the emission sphere (1 by default)
          * @param radius the radius of the emission sphere (1 by default)
          * @param directionRandomizer defines how much to randomize the particle direction [0-1]
          * @param directionRandomizer defines how much to randomize the particle direction [0-1]
          */
          */
@@ -125,7 +125,7 @@ module BABYLON {
     export class SphereDirectedParticleEmitter extends SphereParticleEmitter {
     export class SphereDirectedParticleEmitter extends SphereParticleEmitter {
 
 
         /**
         /**
-         * Creates a new instance of @see SphereDirectedParticleEmitter
+         * Creates a new instance SphereDirectedParticleEmitter
          * @param radius the radius of the emission sphere (1 by default)
          * @param radius the radius of the emission sphere (1 by default)
          * @param direction1 the min limit of the emission direction (up vector by default)
          * @param direction1 the min limit of the emission direction (up vector by default)
          * @param direction2 the max limit of the emission direction (up vector by default)
          * @param direction2 the max limit of the emission direction (up vector by default)

+ 1 - 1
src/Particles/babylon.IParticleSystem.ts

@@ -2,7 +2,7 @@ module BABYLON {
     /**
     /**
      * Interface representing a particle system in Babylon.
      * Interface representing a particle system in Babylon.
      * This groups the common functionalities that needs to be implemented in order to create a particle system.
      * This groups the common functionalities that needs to be implemented in order to create a particle system.
-     * A particle system represents a way to manage particles (@see Particle) from their emission to their animation and rendering.
+     * A particle system represents a way to manage particles from their emission to their animation and rendering.
      */
      */
     export interface IParticleSystem {
     export interface IParticleSystem {
         /**
         /**

+ 1 - 1
src/Particles/babylon.particle.ts

@@ -58,7 +58,7 @@
         private _currentFrameCounter = 0;
         private _currentFrameCounter = 0;
 
 
         /**
         /**
-         * Creates a new instance of @see Particle
+         * Creates a new instance Particle
          * @param particleSystem the particle system the particle belongs to
          * @param particleSystem the particle system the particle belongs to
          */
          */
         constructor(
         constructor(

+ 0 - 3
src/Particles/babylon.solidParticle.ts

@@ -1,7 +1,6 @@
 module BABYLON {
 module BABYLON {
     /**
     /**
      * Represents one particle of a solid particle system.
      * Represents one particle of a solid particle system.
-     * @see SolidParticleSystem
      */
      */
     export class SolidParticle {
     export class SolidParticle {
         /**
         /**
@@ -177,7 +176,6 @@ module BABYLON {
     /**
     /**
      * Represents the shape of the model used by one particle of a solid particle system.
      * Represents the shape of the model used by one particle of a solid particle system.
      * SPS internal tool, don't use it manually.
      * SPS internal tool, don't use it manually.
-     * @see SolidParticleSystem
      */
      */
     export class ModelShape {
     export class ModelShape {
         /**
         /**
@@ -223,7 +221,6 @@ module BABYLON {
 
 
     /**
     /**
      * Represents a Depth Sorted Particle in the solid particle system.
      * Represents a Depth Sorted Particle in the solid particle system.
-     * @see SolidParticleSystem
      */
      */
     export class DepthSortedParticle {
     export class DepthSortedParticle {
         /**
         /**

+ 159 - 185
src/PostProcess/RenderPipeline/Pipelines/babylon.defaultRenderingPipeline.ts

@@ -9,27 +9,7 @@
         /**
         /**
 		 * ID of the sharpen post process,
 		 * ID of the sharpen post process,
 		 */
 		 */
-        readonly SharpenPostProcessId: string = "SharpenPostProcessEffect";
-        /**
-		 * ID of the pass post process used for bloom,
-		 */
-        readonly PassPostProcessId: string = "PassPostProcessEffect";
-        /**
-		 * ID of the highlight post process used for bloom,
-		 */
-        readonly HighLightsPostProcessId: string = "HighLightsPostProcessEffect";
-        /**
-		 * ID of the blurX post process used for bloom,
-		 */
-        readonly BlurXPostProcessId: string = "BlurXPostProcessEffect";
-        /**
-		 * ID of the blurY post process used for bloom,
-		 */
-        readonly BlurYPostProcessId: string = "BlurYPostProcessEffect";
-        /**
-		 * ID of the copy back post process used for bloom,
-		 */
-        readonly CopyBackPostProcessId: string = "CopyBackPostProcessEffect";
+        private readonly SharpenPostProcessId: string = "SharpenPostProcessEffect";
         /**
         /**
 		 * ID of the image processing post process;
 		 * ID of the image processing post process;
 		 */
 		 */
@@ -39,13 +19,13 @@
 		 */
 		 */
         readonly FxaaPostProcessId: string = "FxaaPostProcessEffect";
         readonly FxaaPostProcessId: string = "FxaaPostProcessEffect";
         /**
         /**
-		 * ID of the final merge post process;
+		 * ID of the chromatic aberration post process,
 		 */
 		 */
-        readonly FinalMergePostProcessId: string = "FinalMergePostProcessEffect";
+        private readonly ChromaticAberrationPostProcessId: string = "ChromaticAberrationPostProcessEffect";
         /**
         /**
-		 * ID of the chromatic aberration post process,
+		 * ID of the grain post process
 		 */
 		 */
-        readonly ChromaticAberrationPostProcessId: string = "ChromaticAberrationPostProcessEffect";
+        private readonly GrainPostProcessId: string = "GrainPostProcessEffect";
 
 
         // Post-processes
         // Post-processes
         /**
         /**
@@ -53,26 +33,7 @@
 		 */
 		 */
         public sharpen: SharpenPostProcess;
         public sharpen: SharpenPostProcess;
         private _sharpenEffect: PostProcessRenderEffect;
         private _sharpenEffect: PostProcessRenderEffect;
-        /**
-		 * First pass of bloom to capture the original image texture for later use.
-		 */
-        public pass: PassPostProcess;
-        /**
-		 * Second pass of bloom used to brighten bright portions of the image.
-		 */
-        public highlights: HighlightsPostProcess;
-        /**
-		 * BlurX post process used in coordination with blurY to guassian blur the highlighted image.
-		 */
-        public blurX: BlurPostProcess;
-        /**
-		 * BlurY post process used in coordination with blurX to guassian blur the highlighted image.
-		 */
-        public blurY: BlurPostProcess;
-        /**
-		 * Final pass run for bloom to copy the resulting bloom texture back to screen.
-		 */
-        public copyBack: PassPostProcess;
+        private bloom: BloomEffect;
         /**
         /**
          * Depth of field effect, applies a blur based on how far away objects are from the focus distance.
          * Depth of field effect, applies a blur based on how far away objects are from the focus distance.
          */
          */
@@ -86,31 +47,33 @@
          */
          */
         public imageProcessing: ImageProcessingPostProcess;
         public imageProcessing: ImageProcessingPostProcess;
         /**
         /**
-         * Final post process to merge results of all previous passes
-         */
-        public finalMerge: PassPostProcess;
-        /**
 		 * Chromatic aberration post process which will shift rgb colors in the image
 		 * Chromatic aberration post process which will shift rgb colors in the image
 		 */
 		 */
         public chromaticAberration: ChromaticAberrationPostProcess;
         public chromaticAberration: ChromaticAberrationPostProcess;
         private _chromaticAberrationEffect: PostProcessRenderEffect;
         private _chromaticAberrationEffect: PostProcessRenderEffect;
+        /**
+		 * Grain post process which add noise to the image
+		 */
+        public grain: GrainPostProcess;
+        private _grainEffect: PostProcessRenderEffect;
 
 
         /**
         /**
          * Animations which can be used to tweak settings over a period of time
          * Animations which can be used to tweak settings over a period of time
          */
          */
         public animations: Animation[] = [];
         public animations: Animation[] = [];
 
 
+        private _imageProcessingConfigurationObserver:Nullable<Observer<ImageProcessingConfiguration>> = null;
         // Values   
         // Values   
         private _sharpenEnabled:boolean = false;    
         private _sharpenEnabled:boolean = false;    
         private _bloomEnabled: boolean = false;
         private _bloomEnabled: boolean = false;
         private _depthOfFieldEnabled: boolean = false;
         private _depthOfFieldEnabled: boolean = false;
         private _depthOfFieldBlurLevel = DepthOfFieldEffectBlurLevel.Low;
         private _depthOfFieldBlurLevel = DepthOfFieldEffectBlurLevel.Low;
         private _fxaaEnabled: boolean = false;
         private _fxaaEnabled: boolean = false;
-        private _msaaEnabled: boolean = false;
         private _imageProcessingEnabled: boolean = true;
         private _imageProcessingEnabled: boolean = true;
         private _defaultPipelineTextureType: number;
         private _defaultPipelineTextureType: number;
-        private _bloomScale: number = 0.6;
+        private _bloomScale: number = 0.5;
         private _chromaticAberrationEnabled:boolean = false;  
         private _chromaticAberrationEnabled:boolean = false;  
+        private _grainEnabled:boolean = false;  
 
 
         private _buildAllowed = true;
         private _buildAllowed = true;
 
 
@@ -131,18 +94,31 @@
             return this._sharpenEnabled;
             return this._sharpenEnabled;
         }
         }
 
 
-
+        private _resizeObserver:Nullable<Observer<Engine>> = null;
+        private _hardwareScaleLevel = 1.0;
+        private _bloomKernel: number = 64;
         /**
         /**
 		 * Specifies the size of the bloom blur kernel, relative to the final output size
 		 * Specifies the size of the bloom blur kernel, relative to the final output size
 		 */
 		 */
         @serialize()
         @serialize()
-        public bloomKernel: number = 64;
+        public get bloomKernel(): number{
+            return this._bloomKernel;
+        }
+        public set bloomKernel(value: number){
+            this._bloomKernel = value;
+            this.bloom.kernel = value/this._hardwareScaleLevel;
+        }
 
 
         /**
         /**
 		 * Specifies the weight of the bloom in the final rendering
 		 * Specifies the weight of the bloom in the final rendering
 		 */
 		 */
         @serialize()
         @serialize()
         private _bloomWeight: number = 0.15;
         private _bloomWeight: number = 0.15;
+        /**
+		 * Specifies the luma threshold for the area that will be blurred by the bloom
+		 */
+        @serialize()
+        private _bloomThreshold: number = 0.9;
 
 
         @serialize()
         @serialize()
         private _hdr: boolean;
         private _hdr: boolean;
@@ -154,11 +130,9 @@
             if (this._bloomWeight === value) {
             if (this._bloomWeight === value) {
                 return;
                 return;
             }
             }
+            this.bloom.weight = value;
+            
             this._bloomWeight = value;
             this._bloomWeight = value;
-
-            if (this._hdr && this.copyBack) {
-                this.copyBack.alphaConstants = new Color4(value, value, value, value);
-            }
         }
         }
 
 
         @serialize()
         @serialize()
@@ -167,6 +141,22 @@
         }
         }
 
 
         /**
         /**
+         * The strength of the bloom.
+         */
+        public set bloomThreshold(value: number) {
+            if (this._bloomThreshold === value) {
+                return;
+            }
+            this.bloom.threshold = value;
+            this._bloomThreshold = value;
+        }
+
+        @serialize()
+        public get bloomThreshold(): number {
+            return this._bloomThreshold;
+        }
+
+        /**
          * The scale of the bloom, lower value will provide better performance.
          * The scale of the bloom, lower value will provide better performance.
          */
          */
         public set bloomScale(value: number) {
         public set bloomScale(value: number) {
@@ -175,6 +165,9 @@
             }
             }
             this._bloomScale = value;
             this._bloomScale = value;
 
 
+            // recreate bloom and dispose old as this setting is not dynamic
+            this._rebuildBloom();
+
             this._buildPipeline();
             this._buildPipeline();
         }
         }
 
 
@@ -200,6 +193,16 @@
             return this._bloomEnabled;
             return this._bloomEnabled;
         }
         }
 
 
+        private _rebuildBloom(){
+            // recreate bloom and dispose old as this setting is not dynamic
+            var oldBloom = this.bloom;
+            this.bloom = new BloomEffect(this._scene, this.bloomScale, this._bloomWeight, this.bloomKernel, this._defaultPipelineTextureType, false);
+            this.bloom.threshold = oldBloom.threshold;
+            for (var i = 0; i < this._cameras.length; i++) {
+                oldBloom.disposeEffects(this._cameras[i]);
+            }
+        }
+
         /**
         /**
          * If the depth of field is enabled.
          * If the depth of field is enabled.
          */
          */
@@ -234,7 +237,7 @@
             // recreate dof and dispose old as this setting is not dynamic
             // recreate dof and dispose old as this setting is not dynamic
             var oldDof = this.depthOfField;
             var oldDof = this.depthOfField;
             
             
-            this.depthOfField = new DepthOfFieldEffect(this._scene, null, this._depthOfFieldBlurLevel, this._defaultPipelineTextureType);
+            this.depthOfField = new DepthOfFieldEffect(this._scene, null, this._depthOfFieldBlurLevel, this._defaultPipelineTextureType, false);
             this.depthOfField.focalLength = oldDof.focalLength;
             this.depthOfField.focalLength = oldDof.focalLength;
             this.depthOfField.focusDistance = oldDof.focusDistance;
             this.depthOfField.focusDistance = oldDof.focusDistance;
             this.depthOfField.fStop = oldDof.fStop;
             this.depthOfField.fStop = oldDof.fStop;
@@ -264,21 +267,22 @@
             return this._fxaaEnabled;
             return this._fxaaEnabled;
         }
         }
 
 
+        private _samples = 1;
         /**
         /**
-         * If the multisample anti-aliasing is enabled.
+         * MSAA sample count, setting this to 4 will provide 4x anti aliasing. (default: 1)
          */
          */
-        public set msaaEnabled(enabled: boolean) {
-            if (this._msaaEnabled === enabled) {
+        public set samples(sampleCount: number) {
+            if (this._samples === sampleCount) {
                 return;
                 return;
             }
             }
-            this._msaaEnabled = enabled;
+            this._samples = sampleCount;
 
 
             this._buildPipeline();
             this._buildPipeline();
         }
         }
 
 
         @serialize()
         @serialize()
-        public get msaaEnabled(): boolean {
-            return this._msaaEnabled;
+        public get samples(): number {
+            return this._samples;
         }
         }
 
 
         /**
         /**
@@ -314,6 +318,22 @@
         public get chromaticAberrationEnabled(): boolean {
         public get chromaticAberrationEnabled(): boolean {
             return this._chromaticAberrationEnabled;
             return this._chromaticAberrationEnabled;
         }
         }
+        /**
+         * Enable or disable the grain process from the pipeline
+         */
+        public set grainEnabled(enabled: boolean) {
+            if (this._grainEnabled === enabled) {
+                return;
+            }
+            this._grainEnabled = enabled;
+
+            this._buildPipeline();
+        }
+
+        @serialize()
+        public get grainEnabled(): boolean {
+            return this._grainEnabled;
+        }
 
 
         /**
         /**
          * @constructor
          * @constructor
@@ -358,9 +378,23 @@
 
 
             this.depthOfField = new DepthOfFieldEffect(this._scene, null, this._depthOfFieldBlurLevel, this._defaultPipelineTextureType, true);
             this.depthOfField = new DepthOfFieldEffect(this._scene, null, this._depthOfFieldBlurLevel, this._defaultPipelineTextureType, true);
             
             
+            this.bloom = new BloomEffect(this._scene, this._bloomScale, this._bloomWeight, this.bloomKernel, this._defaultPipelineTextureType, true);
+
             this.chromaticAberration = new ChromaticAberrationPostProcess("ChromaticAberration", engine.getRenderWidth(), engine.getRenderHeight(), 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType, true);
             this.chromaticAberration = new ChromaticAberrationPostProcess("ChromaticAberration", engine.getRenderWidth(), engine.getRenderHeight(), 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType, true);
             this._chromaticAberrationEffect = new PostProcessRenderEffect(engine, this.ChromaticAberrationPostProcessId, () => { return this.chromaticAberration; }, true);
             this._chromaticAberrationEffect = new PostProcessRenderEffect(engine, this.ChromaticAberrationPostProcessId, () => { return this.chromaticAberration; }, true);
-            
+
+            this.grain = new GrainPostProcess("Grain", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType, true);
+            this._grainEffect = new PostProcessRenderEffect(engine, this.GrainPostProcessId, () => { return this.grain; }, true);
+
+            this._resizeObserver = engine.onResizeObservable.add(()=>{
+                this._hardwareScaleLevel = engine.getHardwareScalingLevel();
+                this.bloomKernel = this.bloomKernel
+            })
+
+            this._imageProcessingConfigurationObserver = this._scene.imageProcessingConfiguration.onUpdateParameters.add(()=>{
+                this.bloom._downscale._exposure = this._scene.imageProcessingConfiguration.exposure;
+            })
+
             this._buildPipeline();
             this._buildPipeline();
         }
         }
 
 
@@ -374,14 +408,17 @@
             this._buildAllowed = previousState;
             this._buildAllowed = previousState;
         }
         }
 
 
+        private _hasCleared = false;
         private _prevPostProcess:Nullable<PostProcess> = null;
         private _prevPostProcess:Nullable<PostProcess> = null;
         private _prevPrevPostProcess:Nullable<PostProcess> = null;
         private _prevPrevPostProcess:Nullable<PostProcess> = null;
 
 
         private _setAutoClearAndTextureSharing(postProcess:PostProcess, skipTextureSharing = false){
         private _setAutoClearAndTextureSharing(postProcess:PostProcess, skipTextureSharing = false){
-            if(this._prevPostProcess && this._prevPostProcess.autoClear){
+            if(this._hasCleared){
                 postProcess.autoClear = false;
                 postProcess.autoClear = false;
             }else{
             }else{
                 postProcess.autoClear = true;
                 postProcess.autoClear = true;
+                this._scene.autoClear = false;
+                this._hasCleared = true;
             }
             }
 
 
             if(!skipTextureSharing){
             if(!skipTextureSharing){
@@ -402,7 +439,8 @@
             if (!this._buildAllowed) {
             if (!this._buildAllowed) {
                 return;
                 return;
             }
             }
-
+            this._scene.autoClear = true;
+            
             var engine = this._scene.getEngine();
             var engine = this._scene.getEngine();
 
 
             this._disposePostProcesses();
             this._disposePostProcesses();
@@ -414,14 +452,7 @@
             this._reset();
             this._reset();
             this._prevPostProcess = null;
             this._prevPostProcess = null;
             this._prevPrevPostProcess = null;
             this._prevPrevPostProcess = null;
-
-            if (this.sharpenEnabled) {
-                if(!this.sharpen.isReady()){
-                    this.sharpen.updateEffect();
-                }
-                this.addEffect(this._sharpenEffect);
-                this._setAutoClearAndTextureSharing(this.sharpen);
-            }
+            this._hasCleared = false;            
 
 
             if (this.depthOfFieldEnabled) {
             if (this.depthOfFieldEnabled) {
                 var depthTexture = this._scene.enableDepthRenderer(this._cameras[0]).getDepthMap();
                 var depthTexture = this._scene.enableDepthRenderer(this._cameras[0]).getDepthMap();
@@ -430,90 +461,41 @@
                     this.depthOfField._updateEffects();
                     this.depthOfField._updateEffects();
                 }
                 }
                 this.addEffect(this.depthOfField);
                 this.addEffect(this.depthOfField);
-                this._setAutoClearAndTextureSharing(this.depthOfField._depthOfFieldMerge);
+                this._setAutoClearAndTextureSharing(this.depthOfField._effects[0], true);
             }
             }
 
 
             if (this.bloomEnabled) {
             if (this.bloomEnabled) {
-                this.pass = new PassPostProcess("sceneRenderTarget", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this._setAutoClearAndTextureSharing(this.pass, true);
-                this.addEffect(new PostProcessRenderEffect(engine, this.PassPostProcessId, () => { return this.pass; }, true));
-
-                if (!this._hdr) { // Need to enhance highlights if not using float rendering
-                    this.highlights = new HighlightsPostProcess("highlights", this.bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                    this.addEffect(new PostProcessRenderEffect(engine, this.HighLightsPostProcessId, () => { return this.highlights; }, true));
-                    this.highlights.autoClear = false;
-                    this.highlights.alwaysForcePOT = true;
-                }
-
-                this.blurX = new BlurPostProcess("horizontal blur", new Vector2(1.0, 0), 10.0, this.bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this.addEffect(new PostProcessRenderEffect(engine, this.BlurXPostProcessId, () => { return this.blurX; }, true));
-                this.blurX.alwaysForcePOT = true;
-                this.blurX.autoClear = false;
-                this.blurX.onActivateObservable.add(() => {
-                    let dw = this.blurX.width / engine.getRenderWidth(true);
-                    this.blurX.kernel = this.bloomKernel * dw;
-                });
-
-                this.blurY = new BlurPostProcess("vertical blur", new Vector2(0, 1.0), 10.0, this.bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this.addEffect(new PostProcessRenderEffect(engine, this.BlurYPostProcessId, () => { return this.blurY; }, true));
-                this.blurY.alwaysForcePOT = true;
-                this.blurY.autoClear = false;
-                this.blurY.onActivateObservable.add(() => {
-                    let dh = this.blurY.height / engine.getRenderHeight(true);
-                    this.blurY.kernel = this.bloomKernel * dh;
-                });
-
-                this.copyBack = new PassPostProcess("bloomBlendBlit", this.bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this.addEffect(new PostProcessRenderEffect(engine, this.CopyBackPostProcessId, () => { return this.copyBack; }, true));
-                this.copyBack.alwaysForcePOT = true;
-                if (this._hdr) {
-                    this.copyBack.alphaMode = Engine.ALPHA_INTERPOLATE;
-                    let w = this.bloomWeight;
-                    this.copyBack.alphaConstants = new Color4(w, w, w, w);
-                } else {
-                    this.copyBack.alphaMode = Engine.ALPHA_SCREENMODE;
-                }
-                this.copyBack.autoClear = false;
-            }
-
-            if (this._imageProcessingEnabled) {
-                this.imageProcessing = new ImageProcessingPostProcess("imageProcessing", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                if (this._hdr) {
-                    this.addEffect(new PostProcessRenderEffect(engine, this.ImageProcessingPostProcessId, () => { return this.imageProcessing; }, true));
-                } else {
-                    this._scene.imageProcessingConfiguration.applyByPostProcess = false;
+                if(!this.bloom._isReady()){
+                    this.bloom._updateEffects();
                 }
                 }
+                this.addEffect(this.bloom);
+                this._setAutoClearAndTextureSharing(this.bloom._effects[0], true);
             }
             }
 
 
-            if (this._hdr && this.imageProcessing) {
-                this.finalMerge = this.imageProcessing;
-            }
-            else {
-                this.finalMerge = new PassPostProcess("finalMerge", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this.addEffect(new PostProcessRenderEffect(engine, this.FinalMergePostProcessId, () => { return this.finalMerge; }, true));
-                this._setAutoClearAndTextureSharing(this.finalMerge, true);
-                
-                this.finalMerge.autoClear = !this.bloomEnabled && (!this._hdr || !this.imageProcessing);
+            if (this._imageProcessingEnabled) {	
+                this.imageProcessing = new ImageProcessingPostProcess("imageProcessing", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);	
+                if (this._hdr) {	
+                    this.addEffect(new PostProcessRenderEffect(engine, this.ImageProcessingPostProcessId, () => { return this.imageProcessing; }, true));	
+                    this._setAutoClearAndTextureSharing(this.imageProcessing);	
+                } else {		
+                    this._scene.imageProcessingConfiguration.applyByPostProcess = false;		
+                }		
             }
             }
 
 
-            if (this.bloomEnabled) {
-                if (this._hdr) { // Share render targets to save memory
-                    this.copyBack.shareOutputWith(this.blurX);
-                    if (this.imageProcessing) {
-                        this.imageProcessing.shareOutputWith(this.pass);
-                        this.imageProcessing.autoClear = false;
-                    } else {
-                        this.finalMerge.shareOutputWith(this.pass);
-                    }
-                } else {
-                    this.finalMerge.shareOutputWith(this.pass);
+            if (this.sharpenEnabled) {
+                if(!this.sharpen.isReady()){
+                    this.sharpen.updateEffect();
                 }
                 }
+                this.addEffect(this._sharpenEffect);
+                this._setAutoClearAndTextureSharing(this.sharpen);
             }
             }
 
 
-            if (this.fxaaEnabled) {
-                this.fxaa = new FxaaPostProcess("fxaa", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
-                this.addEffect(new PostProcessRenderEffect(engine, this.FxaaPostProcessId, () => { return this.fxaa; }, true));
-                this._setAutoClearAndTextureSharing(this.fxaa);
+            if (this.grainEnabled) {
+                if(!this.grain.isReady()){
+                    this.grain.updateEffect();
+                }
+                this.addEffect(this._grainEffect);
+                this._setAutoClearAndTextureSharing(this.grain);
             }
             }
 
 
             if (this.chromaticAberrationEnabled) {
             if (this.chromaticAberrationEnabled) {
@@ -524,14 +506,19 @@
                 this._setAutoClearAndTextureSharing(this.chromaticAberration);
                 this._setAutoClearAndTextureSharing(this.chromaticAberration);
             }
             }
 
 
+            if (this.fxaaEnabled) {
+                this.fxaa = new FxaaPostProcess("fxaa", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._defaultPipelineTextureType);
+                this.addEffect(new PostProcessRenderEffect(engine, this.FxaaPostProcessId, () => { return this.fxaa; }, true));
+                this._setAutoClearAndTextureSharing(this.fxaa, true);
+            }
+
             if (this._cameras !== null) {
             if (this._cameras !== null) {
                 this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);
                 this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);
             }
             }
 
 
-            if(this.msaaEnabled){
-                if(!this._enableMSAAOnFirstPostProcess()){
-                    BABYLON.Tools.Warn("MSAA failed to enable, MSAA is only supported in browsers that support webGL >= 2.0");
-                }
+            
+            if(!this._enableMSAAOnFirstPostProcess(this.samples) && this.samples > 1){
+                BABYLON.Tools.Warn("MSAA failed to enable, MSAA is only supported in browsers that support webGL >= 2.0");
             }
             }
         }
         }
 
 
@@ -539,26 +526,6 @@
             for (var i = 0; i < this._cameras.length; i++) {
             for (var i = 0; i < this._cameras.length; i++) {
                 var camera = this._cameras[i];
                 var camera = this._cameras[i];
 
 
-                if (this.pass) {
-                    this.pass.dispose(camera);
-                }
-
-                if (this.highlights) {
-                    this.highlights.dispose(camera);
-                }
-
-                if (this.blurX) {
-                    this.blurX.dispose(camera);
-                }
-
-                if (this.blurY) {
-                    this.blurY.dispose(camera);
-                }
-
-                if (this.copyBack) {
-                    this.copyBack.dispose(camera);
-                }
-
                 if (this.imageProcessing) {
                 if (this.imageProcessing) {
                     this.imageProcessing.dispose(camera);
                     this.imageProcessing.dispose(camera);
                 }
                 }
@@ -567,10 +534,6 @@
                     this.fxaa.dispose(camera);
                     this.fxaa.dispose(camera);
                 }
                 }
 
 
-                if (this.finalMerge) {
-                    this.finalMerge.dispose(camera);
-                }
-
                 // These are created in the constructor and should not be disposed on every pipeline change
                 // These are created in the constructor and should not be disposed on every pipeline change
                 if(disposeNonRecreated){
                 if(disposeNonRecreated){
                     if (this.sharpen) {
                     if (this.sharpen) {
@@ -580,26 +543,33 @@
                     if(this.depthOfField){
                     if(this.depthOfField){
                         this.depthOfField.disposeEffects(camera);
                         this.depthOfField.disposeEffects(camera);
                     }
                     }
+
+                    if(this.bloom){
+                        this.bloom.disposeEffects(camera);
+                    }
     
     
                     if(this.chromaticAberration){
                     if(this.chromaticAberration){
                         this.chromaticAberration.dispose(camera);
                         this.chromaticAberration.dispose(camera);
                     }
                     }
+
+                    if(this.grain){
+                        this.grain.dispose(camera);
+                    }
                 }
                 }
             }
             }
-
-            (<any>this.pass) = null;
-            (<any>this.highlights) = null;
-            (<any>this.blurX) = null;
-            (<any>this.blurY) = null;
-            (<any>this.copyBack) = null;
+            
             (<any>this.imageProcessing) = null;
             (<any>this.imageProcessing) = null;
             (<any>this.fxaa) = null;
             (<any>this.fxaa) = null;
-            (<any>this.finalMerge) = null;
 
 
             if(disposeNonRecreated){
             if(disposeNonRecreated){
                 (<any>this.sharpen) = null;
                 (<any>this.sharpen) = null;
+                (<any>this._sharpenEffect) = null;
                 (<any>this.depthOfField) = null;
                 (<any>this.depthOfField) = null;
+                (<any>this.bloom) = null;
                 (<any>this.chromaticAberration) = null;
                 (<any>this.chromaticAberration) = null;
+                (<any>this._chromaticAberrationEffect) = null;
+                (<any>this.grain) = null;
+                (<any>this._grainEffect) = null;
             } 
             } 
         }
         }
 
 
@@ -608,9 +578,13 @@
          */
          */
         public dispose(): void {
         public dispose(): void {
             this._disposePostProcesses(true);
             this._disposePostProcesses(true);
-
             this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
             this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
-
+            this._scene.autoClear = true;
+            if(this._resizeObserver){
+                this._scene.getEngine().onResizeObservable.remove(this._resizeObserver);
+                this._resizeObserver = null;
+            }
+            this._scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigurationObserver)
             super.dispose();
             super.dispose();
         }
         }
 
 

+ 0 - 3
src/PostProcess/RenderPipeline/Pipelines/babylon.lensRenderingPipeline.ts

@@ -21,17 +21,14 @@ module BABYLON {
 
 
         /**
         /**
         * The chromatic aberration PostProcess id in the pipeline
         * The chromatic aberration PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public LensChromaticAberrationEffect: string = "LensChromaticAberrationEffect";
         public LensChromaticAberrationEffect: string = "LensChromaticAberrationEffect";
         /**
         /**
         * The highlights enhancing PostProcess id in the pipeline
         * The highlights enhancing PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public HighlightsEnhancingEffect: string = "HighlightsEnhancingEffect";
         public HighlightsEnhancingEffect: string = "HighlightsEnhancingEffect";
         /**
         /**
         * The depth-of-field PostProcess id in the pipeline
         * The depth-of-field PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public LensDepthOfFieldEffect: string = "LensDepthOfFieldEffect";
         public LensDepthOfFieldEffect: string = "LensDepthOfFieldEffect";
 
 

+ 0 - 15
src/PostProcess/RenderPipeline/Pipelines/babylon.ssao2RenderingPipeline.ts

@@ -4,67 +4,56 @@
 
 
         /**
         /**
         * The PassPostProcess id in the pipeline that contains the original scene color
         * The PassPostProcess id in the pipeline that contains the original scene color
-        * @type {string}
         */
         */
         public SSAOOriginalSceneColorEffect: string = "SSAOOriginalSceneColorEffect";
         public SSAOOriginalSceneColorEffect: string = "SSAOOriginalSceneColorEffect";
         /**
         /**
         * The SSAO PostProcess id in the pipeline
         * The SSAO PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAORenderEffect: string = "SSAORenderEffect";
         public SSAORenderEffect: string = "SSAORenderEffect";
         /**
         /**
         * The horizontal blur PostProcess id in the pipeline
         * The horizontal blur PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAOBlurHRenderEffect: string = "SSAOBlurHRenderEffect";
         public SSAOBlurHRenderEffect: string = "SSAOBlurHRenderEffect";
         /**
         /**
         * The vertical blur PostProcess id in the pipeline
         * The vertical blur PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAOBlurVRenderEffect: string = "SSAOBlurVRenderEffect";
         public SSAOBlurVRenderEffect: string = "SSAOBlurVRenderEffect";
         /**
         /**
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
-        * @type {string}
         */
         */
         public SSAOCombineRenderEffect: string = "SSAOCombineRenderEffect";
         public SSAOCombineRenderEffect: string = "SSAOCombineRenderEffect";
 
 
         /**
         /**
         * The output strength of the SSAO post-process. Default value is 1.0.
         * The output strength of the SSAO post-process. Default value is 1.0.
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public totalStrength: number = 1.0;
         public totalStrength: number = 1.0;
 
 
         /**
         /**
         * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.
         * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public maxZ: number = 100.0;
         public maxZ: number = 100.0;
 
 
         /**
         /**
         * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much
         * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public minZAspect: number = 0.2;
         public minZAspect: number = 0.2;
 
 
         /**
         /**
         * Number of samples used for the SSAO calculations. Default value is 8
         * Number of samples used for the SSAO calculations. Default value is 8
-        * @type {number}
         */
         */
         @serialize("samples")
         @serialize("samples")
         private _samples: number = 8;
         private _samples: number = 8;
 
 
         /**
         /**
         * Dynamically generated sphere sampler.
         * Dynamically generated sphere sampler.
-        * @type {number[]}
         */
         */
         private _sampleSphere: number[];
         private _sampleSphere: number[];
 
 
         /**
         /**
         * Blur filter offsets
         * Blur filter offsets
-        * @type {number[]}
         */
         */
         private _samplerOffsets: number[];
         private _samplerOffsets: number[];
 
 
@@ -82,7 +71,6 @@
 
 
         /**
         /**
         * Are we using bilateral blur ?
         * Are we using bilateral blur ?
-        * @type {boolean}
         */
         */
         @serialize("expensiveBlur")
         @serialize("expensiveBlur")
         private _expensiveBlur: boolean = true;
         private _expensiveBlur: boolean = true;
@@ -101,7 +89,6 @@
 
 
         /**
         /**
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public radius: number = 2.0;
         public radius: number = 2.0;
@@ -109,14 +96,12 @@
         /**
         /**
         * The base color of the SSAO post-process
         * The base color of the SSAO post-process
         * The final result is "base + ssao" between [0, 1]
         * The final result is "base + ssao" between [0, 1]
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public base: number = 0.1;
         public base: number = 0.1;
 
 
         /**
         /**
         *  Support test.
         *  Support test.
-        * @type {boolean}
         */
         */
         public static get IsSupported(): boolean {
         public static get IsSupported(): boolean {
             var engine = Engine.LastCreatedEngine;
             var engine = Engine.LastCreatedEngine;

+ 0 - 10
src/PostProcess/RenderPipeline/Pipelines/babylon.ssaoRenderingPipeline.ts

@@ -4,40 +4,33 @@
 
 
         /**
         /**
         * The PassPostProcess id in the pipeline that contains the original scene color
         * The PassPostProcess id in the pipeline that contains the original scene color
-        * @type {string}
         */
         */
         public SSAOOriginalSceneColorEffect: string = "SSAOOriginalSceneColorEffect";
         public SSAOOriginalSceneColorEffect: string = "SSAOOriginalSceneColorEffect";
         /**
         /**
         * The SSAO PostProcess id in the pipeline
         * The SSAO PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAORenderEffect: string = "SSAORenderEffect";
         public SSAORenderEffect: string = "SSAORenderEffect";
         /**
         /**
         * The horizontal blur PostProcess id in the pipeline
         * The horizontal blur PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAOBlurHRenderEffect: string = "SSAOBlurHRenderEffect";
         public SSAOBlurHRenderEffect: string = "SSAOBlurHRenderEffect";
         /**
         /**
         * The vertical blur PostProcess id in the pipeline
         * The vertical blur PostProcess id in the pipeline
-        * @type {string}
         */
         */
         public SSAOBlurVRenderEffect: string = "SSAOBlurVRenderEffect";
         public SSAOBlurVRenderEffect: string = "SSAOBlurVRenderEffect";
         /**
         /**
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
-        * @type {string}
         */
         */
         public SSAOCombineRenderEffect: string = "SSAOCombineRenderEffect";
         public SSAOCombineRenderEffect: string = "SSAOCombineRenderEffect";
 
 
         /**
         /**
         * The output strength of the SSAO post-process. Default value is 1.0.
         * The output strength of the SSAO post-process. Default value is 1.0.
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public totalStrength: number = 1.0;
         public totalStrength: number = 1.0;
 
 
         /**
         /**
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 0.0006
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 0.0006
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public radius: number = 0.0001;
         public radius: number = 0.0001;
@@ -46,7 +39,6 @@
         * Related to fallOff, used to interpolate SSAO samples (first interpolate function input) based on the occlusion difference of each pixel
         * Related to fallOff, used to interpolate SSAO samples (first interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to fallOff and superior to fallOff.
         * Must not be equal to fallOff and superior to fallOff.
         * Default value is 0.975
         * Default value is 0.975
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public area: number = 0.0075;
         public area: number = 0.0075;
@@ -55,7 +47,6 @@
         * Related to area, used to interpolate SSAO samples (second interpolate function input) based on the occlusion difference of each pixel
         * Related to area, used to interpolate SSAO samples (second interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to area and inferior to area.
         * Must not be equal to area and inferior to area.
         * Default value is 0.0
         * Default value is 0.0
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public fallOff: number = 0.000001;
         public fallOff: number = 0.000001;
@@ -63,7 +54,6 @@
         /**
         /**
         * The base color of the SSAO post-process
         * The base color of the SSAO post-process
         * The final result is "base + ssao" between [0, 1]
         * The final result is "base + ssao" between [0, 1]
-        * @type {number}
         */
         */
         @serialize()
         @serialize()
         public base: number = 0.5;
         public base: number = 0.5;

+ 2 - 2
src/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts

@@ -143,13 +143,13 @@ module BABYLON {
             this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();
             this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();
         }
         }
 
 
-        protected _enableMSAAOnFirstPostProcess():boolean{
+        protected _enableMSAAOnFirstPostProcess(sampleCount: number):boolean{
             // Set samples of the very first post process to 4 to enable native anti-aliasing in browsers that support webGL 2.0 (See: https://github.com/BabylonJS/Babylon.js/issues/3754)
             // Set samples of the very first post process to 4 to enable native anti-aliasing in browsers that support webGL 2.0 (See: https://github.com/BabylonJS/Babylon.js/issues/3754)
             var effectKeys = Object.keys(this._renderEffects);
             var effectKeys = Object.keys(this._renderEffects);
             if(this.engine.webGLVersion >= 2 && effectKeys.length > 0){
             if(this.engine.webGLVersion >= 2 && effectKeys.length > 0){
                 var postProcesses = this._renderEffects[effectKeys[0]].getPostProcesses();
                 var postProcesses = this._renderEffects[effectKeys[0]].getPostProcesses();
                 if(postProcesses){
                 if(postProcesses){
-                    postProcesses[0].samples = 4;
+                    postProcesses[0].samples = sampleCount;
                     return true;
                     return true;
                 }
                 }
             }
             }

+ 2 - 2
src/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts

@@ -1,7 +1,7 @@
 module BABYLON {
 module BABYLON {
     export class PostProcessRenderPipelineManager {
     export class PostProcessRenderPipelineManager {
-        private _renderPipelines: any;
-
+        private _renderPipelines: {[Key:string]:PostProcessRenderPipeline};
+        
         constructor() {
         constructor() {
             this._renderPipelines = {};
             this._renderPipelines = {};
         }
         }

+ 114 - 0
src/PostProcess/babylon.bloomEffect.ts

@@ -0,0 +1,114 @@
+module BABYLON {
+    /**
+     * The bloom effect spreads bright areas of an image to simulate artifacts seen in cameras
+     */
+    export class BloomEffect extends PostProcessRenderEffect{
+        /**
+         * Internal
+         */
+        public _effects: Array<PostProcess> = [];
+
+        /**
+         * Internal
+         */
+        public _downscale:ExtractHighlightsPostProcess;
+        private _blurX:BlurPostProcess;
+        private _blurY:BlurPostProcess;
+        private _merge:BloomMergePostProcess;
+        
+        /**
+         * The luminance threshold to find bright areas of the image to bloom. 
+         */
+        public get threshold():number{
+            return this._downscale.threshold;
+        }
+        public set threshold(value: number){
+            this._downscale.threshold = value;
+        }
+
+        /**
+         * The strength of the bloom.
+         */
+        public get weight():number{
+            return this._merge.weight;
+        }
+        public set weight(value: number){
+            this._merge.weight = value;
+        }
+
+        /**
+         * Specifies the size of the bloom blur kernel, relative to the final output size
+         */
+        public get kernel():number{
+            return this._blurX.kernel / this.bloomScale;
+        }
+        public set kernel(value: number){
+            this._blurX.kernel = value * this.bloomScale;
+            this._blurY.kernel = value * this.bloomScale;
+        }
+        
+        /**
+         * Creates a new instance of @see BloomEffect
+         * @param scene The scene the effect belongs to.
+         * @param bloomScale The ratio of the blur texture to the input texture that should be used to compute the bloom.
+         * @param bloomKernel The size of the kernel to be used when applying the blur.
+         * @param bloomWeight The the strength of bloom.
+         * @param pipelineTextureType The type of texture to be used when performing the post processing.
+         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
+         */
+        constructor(scene: Scene, private bloomScale:number, bloomWeight:number, bloomKernel:number, pipelineTextureType = 0, blockCompilation = false) {
+            super(scene.getEngine(), "bloom", ()=>{
+                return this._effects;
+            }, true);
+            this._downscale = new ExtractHighlightsPostProcess("highlights", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
+
+            this._blurX = new BlurPostProcess("horizontal blur", new Vector2(1.0, 0), 10.0, bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, undefined, blockCompilation);
+            this._blurX.alwaysForcePOT = true;
+            this._blurX.autoClear = false;
+
+            this._blurY = new BlurPostProcess("vertical blur", new Vector2(0, 1.0), 10.0, bloomScale, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, undefined, blockCompilation);
+            this._blurY.alwaysForcePOT = true;
+            this._blurY.autoClear = false;
+
+            this.kernel = bloomKernel;
+
+            this._effects = [this._downscale, this._blurX, this._blurY];
+
+            this._merge = new BloomMergePostProcess("bloomMerge", this._downscale, this._blurY, bloomWeight, bloomScale, null, BABYLON.Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, pipelineTextureType, blockCompilation);
+            this._merge.autoClear = false;
+            this._effects.push(this._merge);
+        }
+
+        /**
+         * Disposes each of the internal effects for a given camera.
+         * @param camera The camera to dispose the effect on.
+         */
+        public disposeEffects(camera:Camera){
+            for(var effect in this._effects){
+                this._effects[effect].dispose(camera);
+            }
+        }
+        
+        /**
+         * Internal
+         */
+        public _updateEffects(){
+            for(var effect in this._effects){
+                this._effects[effect].updateEffect();
+            }
+        }
+
+        /**
+         * Internal
+         * @returns if all the contained post processes are ready.
+         */
+        public _isReady(){
+            for(var effect in this._effects){
+                if(!this._effects[effect].isReady()){
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+}

+ 33 - 0
src/PostProcess/babylon.bloomMergePostProcess.ts

@@ -0,0 +1,33 @@
+module BABYLON {
+    /**
+     * The BloomMergePostProcess merges blurred images with the original based on the values of the circle of confusion.
+     */
+    export class BloomMergePostProcess extends PostProcess {
+        /**
+         * Creates a new instance of @see BloomMergePostProcess
+         * @param name The name of the effect.
+         * @param originalFromInput Post process which's input will be used for the merge.
+         * @param blurred Blurred highlights post process which's output will be used.
+         * @param weight Weight of the bloom to be added to the original input.
+         * @param options The required width/height ratio to downsize to before computing the render pass.
+         * @param camera The camera to apply the render pass to.
+         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
+         * @param engine The engine which the post process will be applied. (default: current engine)
+         * @param reusable If the post process can be reused on the same frame. (default: false)
+         * @param textureType Type of textures used when performing the post process. (default: 0)
+         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
+         */
+        constructor(name: string, originalFromInput:PostProcess, blurred:PostProcess, /** Weight of the bloom to be added to the original input. */ public weight:number, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: Engine, reusable?: boolean, textureType: number = Engine.TEXTURETYPE_UNSIGNED_INT, blockCompilation = false) {
+            super(name, "bloomMerge", ["bloomWeight"], ["circleOfConfusionSampler", "blurStep0", "blurStep1", "blurStep2", "bloomBlur"], options, camera, samplingMode, engine, reusable, null, textureType, undefined, null, true);
+            this.onApplyObservable.add((effect: Effect) => {
+                effect.setTextureFromPostProcess("textureSampler", originalFromInput);
+                effect.setTextureFromPostProcessOutput("bloomBlur", blurred);
+                effect.setFloat("bloomWeight", this.weight);   
+            });
+
+            if(!blockCompilation){
+                this.updateEffect();
+            }
+        }
+    }
+}

+ 2 - 1
src/PostProcess/babylon.blurPostProcess.ts

@@ -52,7 +52,7 @@
 		}
 		}
 
 
 		/**
 		/**
-         * Creates a new instance of @see BlurPostProcess
+         * Creates a new instance BlurPostProcess
          * @param name The name of the effect.
          * @param name The name of the effect.
          * @param direction The direction in which to blur the image.
          * @param direction The direction in which to blur the image.
 		 * @param kernel The size of the kernel to be used when computing the blur. eg. Size of 3 will blur the center pixel by 2 pixels surrounding it.
 		 * @param kernel The size of the kernel to be used when computing the blur. eg. Size of 3 will blur the center pixel by 2 pixels surrounding it.
@@ -174,6 +174,7 @@
 				defines += `#define PACKEDFLOAT 1`;
 				defines += `#define PACKEDFLOAT 1`;
 			}
 			}
 
 
+			this.blockCompilation = false;
             super.updateEffect(defines, null, null, {
             super.updateEffect(defines, null, null, {
 				varyingCount: varyingCount,
 				varyingCount: varyingCount,
 				depCount: depCount
 				depCount: depCount

+ 1 - 1
src/PostProcess/babylon.chromaticAberrationPostProcess.ts

@@ -24,7 +24,7 @@ module BABYLON {
         centerPosition = new Vector2(0.5,0.5);
         centerPosition = new Vector2(0.5,0.5);
         
         
         /**
         /**
-         * Creates a new instance of @see ChromaticAberrationPostProcess
+         * Creates a new instance ChromaticAberrationPostProcess
          * @param name The name of the effect.
          * @param name The name of the effect.
          * @param screenWidth The width of the screen to apply the effect on.
          * @param screenWidth The width of the screen to apply the effect on.
          * @param screenHeight The height of the screen to apply the effect on.
          * @param screenHeight The height of the screen to apply the effect on.

+ 1 - 1
src/PostProcess/babylon.circleOfConfusionPostProcess.ts

@@ -22,7 +22,7 @@ module BABYLON {
         
         
         private _depthTexture:Nullable<RenderTargetTexture> = null;
         private _depthTexture:Nullable<RenderTargetTexture> = null;
         /**
         /**
-         * Creates a new instance of @see CircleOfConfusionPostProcess
+         * Creates a new instance CircleOfConfusionPostProcess
          * @param name The name of the effect.
          * @param name The name of the effect.
          * @param depthTexture The depth texture of the scene to compute the circle of confusion. This must be set in order for this to function but may be set after initialization if needed.
          * @param depthTexture The depth texture of the scene to compute the circle of confusion. This must be set in order for this to function but may be set after initialization if needed.
          * @param options The required width/height ratio to downsize to before computing the render pass.
          * @param options The required width/height ratio to downsize to before computing the render pass.

+ 1 - 1
src/PostProcess/babylon.convolutionPostProcess.ts

@@ -6,7 +6,7 @@
      */
      */
     export class ConvolutionPostProcess extends PostProcess{
     export class ConvolutionPostProcess extends PostProcess{
         /**
         /**
-         * Creates a new instance of @see ConvolutionPostProcess
+         * Creates a new instance ConvolutionPostProcess
          * @param name The name of the effect.
          * @param name The name of the effect.
          * @param kernel Array of 9 values corrisponding to the 3x3 kernel to be applied
          * @param kernel Array of 9 values corrisponding to the 3x3 kernel to be applied
          * @param options The required width/height ratio to downsize to before computing the render pass.
          * @param options The required width/height ratio to downsize to before computing the render pass.

+ 1 - 1
src/PostProcess/babylon.depthOfFieldBlurPostProcess.ts

@@ -7,7 +7,7 @@ module BABYLON {
      */
      */
     export class DepthOfFieldBlurPostProcess extends BlurPostProcess {
     export class DepthOfFieldBlurPostProcess extends BlurPostProcess {
         /**
         /**
-         * Creates a new instance of @see CircleOfConfusionPostProcess
+         * Creates a new instance CircleOfConfusionPostProcess
          * @param name The name of the effect.
          * @param name The name of the effect.
          * @param scene The scene the effect belongs to.
          * @param scene The scene the effect belongs to.
          * @param direction The direction the blur should be applied.
          * @param direction The direction the blur should be applied.

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


部分文件因为文件数量过多而无法显示