Преглед на файлове

Merge pull request #7890 from BabylonJS/master

TS 3.8.3
mergify[bot] преди 5 години
родител
ревизия
259d3a0be4
променени са 72 файла, в които са добавени 4466 реда и са изтрити 1966 реда
  1. 3 1
      Playground/js/frame.js
  2. 6 1
      Playground/js/mainWebGPU.js
  3. BIN
      Playground/textures/ParallaxDiffuse.png
  4. BIN
      Playground/textures/ParallaxNormal.png
  5. 179 42
      dist/preview release/babylon.d.ts
  6. 2 2
      dist/preview release/babylon.js
  7. 614 87
      dist/preview release/babylon.max.js
  8. 1 1
      dist/preview release/babylon.max.js.map
  9. 377 84
      dist/preview release/babylon.module.d.ts
  10. 179 42
      dist/preview release/documentation.d.ts
  11. 48 48
      dist/preview release/gui/babylon.gui.js
  12. 1 1
      dist/preview release/gui/babylon.gui.js.map
  13. 1 1
      dist/preview release/inspector/babylon.inspector.bundle.js
  14. 9 9
      dist/preview release/inspector/babylon.inspector.bundle.max.js
  15. 1 1
      dist/preview release/inspector/babylon.inspector.bundle.max.js.map
  16. 1 1
      dist/preview release/inspector/babylon.inspector.d.ts
  17. 2 3
      dist/preview release/inspector/babylon.inspector.module.d.ts
  18. 2 0
      dist/preview release/loaders/babylon.glTF2FileLoader.js
  19. 1 1
      dist/preview release/loaders/babylon.glTF2FileLoader.js.map
  20. 1 1
      dist/preview release/loaders/babylon.glTF2FileLoader.min.js
  21. 2 0
      dist/preview release/loaders/babylon.glTFFileLoader.js
  22. 1 1
      dist/preview release/loaders/babylon.glTFFileLoader.js.map
  23. 2 2
      dist/preview release/loaders/babylon.glTFFileLoader.min.js
  24. 2 0
      dist/preview release/loaders/babylonjs.loaders.js
  25. 1 1
      dist/preview release/loaders/babylonjs.loaders.js.map
  26. 2 2
      dist/preview release/loaders/babylonjs.loaders.min.js
  27. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.d.ts
  28. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.js
  29. 3 5
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js
  30. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map
  31. 2 2
      dist/preview release/nodeEditor/babylon.nodeEditor.module.d.ts
  32. 1 1
      dist/preview release/packagesSizeBaseLine.json
  33. 377 84
      dist/preview release/viewer/babylon.module.d.ts
  34. 29 29
      dist/preview release/viewer/babylon.viewer.d.ts
  35. 341 265
      dist/preview release/viewer/babylon.viewer.js
  36. 2 2
      dist/preview release/viewer/babylon.viewer.max.js
  37. 29 29
      dist/preview release/viewer/babylon.viewer.module.d.ts
  38. 6 1
      dist/preview release/what's new.md
  39. 2 0
      loaders/src/glTF/2.0/glTFLoader.ts
  40. 2 2
      package.json
  41. 92 0
      src/Engines/Processors/Expressions/shaderDefineExpression.ts
  42. 40 21
      src/Engines/Processors/shaderProcessor.ts
  43. 15 13
      src/Materials/Textures/Packer/packer.ts
  44. 2 2
      src/Meshes/mesh.ts
  45. 11 11
      src/Shaders/ShadersInclude/lightFragment.fx
  46. 73 0
      src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx
  47. 44 0
      src/Shaders/ShadersInclude/pbrBlockAlphaFresnel.fx
  48. 32 0
      src/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.fx
  49. 48 0
      src/Shaders/ShadersInclude/pbrBlockAnisotropic.fx
  50. 319 0
      src/Shaders/ShadersInclude/pbrBlockClearcoat.fx
  51. 32 0
      src/Shaders/ShadersInclude/pbrBlockDirectLighting.fx
  52. 47 0
      src/Shaders/ShadersInclude/pbrBlockFinalColorComposition.fx
  53. 133 0
      src/Shaders/ShadersInclude/pbrBlockFinalLitComponents.fx
  54. 32 0
      src/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.fx
  55. 35 0
      src/Shaders/ShadersInclude/pbrBlockGeometryInfo.fx
  56. 15 0
      src/Shaders/ShadersInclude/pbrBlockImageProcessing.fx
  57. 12 0
      src/Shaders/ShadersInclude/pbrBlockNormalFinal.fx
  58. 13 0
      src/Shaders/ShadersInclude/pbrBlockNormalGeometric.fx
  59. 26 0
      src/Shaders/ShadersInclude/pbrBlockReflectance.fx
  60. 4 0
      src/Shaders/ShadersInclude/pbrBlockReflectance0.fx
  61. 182 0
      src/Shaders/ShadersInclude/pbrBlockReflection.fx
  62. 161 0
      src/Shaders/ShadersInclude/pbrBlockReflectivity.fx
  63. 212 0
      src/Shaders/ShadersInclude/pbrBlockSheen.fx
  64. 339 0
      src/Shaders/ShadersInclude/pbrBlockSubSurface.fx
  65. 30 30
      src/Shaders/ShadersInclude/pbrDebug.fx
  66. 266 1134
      src/Shaders/pbr.fragment.fx
  67. BIN
      tests/validation/ReferenceImages/pbr_codecoverage.png
  68. BIN
      tests/validation/ReferenceImages/pbr_codecoverage1.png
  69. BIN
      tests/validation/ReferenceImages/pbr_codecoverage2.png
  70. BIN
      tests/validation/ReferenceImages/pbr_codecoverage3.png
  71. 15 0
      tests/validation/config.json
  72. 1 0
      tests/validation/validation.js

+ 3 - 1
Playground/js/frame.js

@@ -118,7 +118,9 @@ run = function () {
                 if (scene.activeCamera || scene.activeCameras.length > 0) {
                     scene.render();
                 }
-                if (fpsLabel) {
+                if (fpsLabel && !(scene.activeCamera && 
+                    scene.activeCamera.getClassName && 
+                    scene.activeCamera.getClassName() === 'WebXRCamera')) {
                     fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
                 }
             }.bind(this));

+ 6 - 1
Playground/js/mainWebGPU.js

@@ -153,7 +153,12 @@ compileAndRun = function(parent, fpsLabel) {
                         scene.render();
                     }
 
-                    fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
+                    // Update FPS if camera is not a webxr camera
+                    if(!(scene.activeCamera && 
+                        scene.activeCamera.getClassName && 
+                        scene.activeCamera.getClassName() === 'WebXRCamera')) {
+                        fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
+                    }
                 }.bind(this));
 
                 if (checkSceneCount && engine.scenes.length === 0) {

BIN
Playground/textures/ParallaxDiffuse.png


BIN
Playground/textures/ParallaxNormal.png


+ 179 - 42
dist/preview release/babylon.d.ts

@@ -1183,6 +1183,10 @@ declare module BABYLON {
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module BABYLON {
@@ -48517,18 +48521,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -48636,18 +48640,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -51203,6 +51207,139 @@ declare module BABYLON {
 }
 declare module BABYLON {
     /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
     export var pbrDebug: {
         name: string;
         shader: string;
@@ -70009,52 +70146,52 @@ declare module BABYLON {
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };

Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/preview release/babylon.js


Файловите разлики са ограничени, защото са твърде много
+ 614 - 87
dist/preview release/babylon.max.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/babylon.max.js.map


+ 377 - 84
dist/preview release/babylon.module.d.ts

@@ -1193,6 +1193,10 @@ declare module "babylonjs/Engines/Processors/Expressions/shaderDefineExpression"
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module "babylonjs/Engines/Processors/shaderCodeTestNode" {
@@ -50444,18 +50448,18 @@ declare module "babylonjs/Gamepads/Controllers/windowsMotionController" {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -50563,18 +50567,18 @@ declare module "babylonjs/Gamepads/Controllers/windowsMotionController" {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -53340,6 +53344,139 @@ declare module "babylonjs/Shaders/ShadersInclude/pbrIBLFunctions" {
         shader: string;
     };
 }
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAlbedoOpacity" {
+    /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectivity" {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAmbientOcclusion" {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAlphaFresnel" {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAnisotropic" {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflection" {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockSheen" {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockClearcoat" {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockSubSurface" {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockNormalGeometric" {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockNormalFinal" {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockGeometryInfo" {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance0" {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance" {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockDirectLighting" {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalLitComponents" {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents" {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalColorComposition" {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockImageProcessing" {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
 declare module "babylonjs/Shaders/ShadersInclude/pbrDebug" {
     /** @hidden */
     export var pbrDebug: {
@@ -53370,12 +53507,31 @@ declare module "babylonjs/Shaders/pbr.fragment" {
     import "babylonjs/Shaders/ShadersInclude/pbrIBLFunctions";
     import "babylonjs/Shaders/ShadersInclude/bumpFragmentFunctions";
     import "babylonjs/Shaders/ShadersInclude/reflectionFunction";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAlbedoOpacity";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectivity";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAmbientOcclusion";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAlphaFresnel";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAnisotropic";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflection";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockSheen";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockClearcoat";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockSubSurface";
     import "babylonjs/Shaders/ShadersInclude/clipPlaneFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockNormalGeometric";
     import "babylonjs/Shaders/ShadersInclude/bumpFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockNormalFinal";
     import "babylonjs/Shaders/ShadersInclude/depthPrePass";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockGeometryInfo";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance0";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockDirectLighting";
     import "babylonjs/Shaders/ShadersInclude/lightFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalLitComponents";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalColorComposition";
     import "babylonjs/Shaders/ShadersInclude/logDepthFragment";
     import "babylonjs/Shaders/ShadersInclude/fogFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockImageProcessing";
     import "babylonjs/Shaders/ShadersInclude/pbrDebug";
     /** @hidden */
     export var pbrPixelShader: {
@@ -73791,52 +73947,52 @@ declare module "babylonjs/XR/motionController/webXRMicrosoftMixedRealityControll
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };
@@ -75305,6 +75461,10 @@ declare module BABYLON {
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module BABYLON {
@@ -122639,18 +122799,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -122758,18 +122918,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -125325,6 +125485,139 @@ declare module BABYLON {
 }
 declare module BABYLON {
     /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
     export var pbrDebug: {
         name: string;
         shader: string;
@@ -144131,52 +144424,52 @@ declare module BABYLON {
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };

+ 179 - 42
dist/preview release/documentation.d.ts

@@ -1183,6 +1183,10 @@ declare module BABYLON {
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module BABYLON {
@@ -48517,18 +48521,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -48636,18 +48640,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -51203,6 +51207,139 @@ declare module BABYLON {
 }
 declare module BABYLON {
     /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
     export var pbrDebug: {
         name: string;
         shader: string;
@@ -70009,52 +70146,52 @@ declare module BABYLON {
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };

+ 48 - 48
dist/preview release/gui/babylon.gui.js

@@ -7,7 +7,7 @@
 		exports["babylonjs-gui"] = factory(require("babylonjs"));
 	else
 		root["BABYLON"] = root["BABYLON"] || {}, root["BABYLON"]["GUI"] = factory(root["BABYLON"]);
-})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), function(__WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__) {
+})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), function(__WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_perfCounter__) {
 return /******/ (function(modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
@@ -366,7 +366,7 @@ module.exports = g;
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdvancedDynamicTextureInstrumentation", function() { return AdvancedDynamicTextureInstrumentation; });
-/* harmony import */ var babylonjs_Misc_perfCounter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/perfCounter */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_perfCounter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/perfCounter */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_perfCounter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_perfCounter__WEBPACK_IMPORTED_MODULE_0__);
 
 /**
@@ -509,7 +509,7 @@ var AdvancedDynamicTextureInstrumentation = /** @class */ (function () {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AdvancedDynamicTexture", function() { return AdvancedDynamicTexture; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _controls_container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./controls/container */ "./2D/controls/container.ts");
 /* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./style */ "./2D/style.ts");
@@ -1481,7 +1481,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _textBlock__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./textBlock */ "./2D/controls/textBlock.ts");
 /* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./image */ "./2D/controls/image.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_5__);
 
 
@@ -1713,7 +1713,7 @@ babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_5__["_TypeStore"].RegisteredTy
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Checkbox", function() { return Checkbox; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _stackPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stackPanel */ "./2D/controls/stackPanel.ts");
@@ -1896,7 +1896,7 @@ babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].RegisteredT
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ColorPicker", function() { return ColorPicker; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _inputText__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./inputText */ "./2D/controls/inputText.ts");
@@ -3285,7 +3285,7 @@ babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].RegisteredT
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Container", function() { return Container; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _measure__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../measure */ "./2D/measure.ts");
@@ -3700,7 +3700,7 @@ babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].RegisteredTypes
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Control", function() { return Control; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../valueAndUnit */ "./2D/valueAndUnit.ts");
 /* harmony import */ var _measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../measure */ "./2D/measure.ts");
@@ -5619,7 +5619,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DisplayGrid", function() { return DisplayGrid; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__);
 
 
@@ -5852,7 +5852,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./container */ "./2D/controls/container.ts");
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__);
 
 
@@ -5949,7 +5949,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./container */ "./2D/controls/container.ts");
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../valueAndUnit */ "./2D/valueAndUnit.ts");
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_4__);
 
 
@@ -6407,7 +6407,7 @@ babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_4__["_TypeStore"].RegisteredTypes[
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Image", function() { return Image; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 
@@ -7334,7 +7334,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputPassword", function() { return InputPassword; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _inputText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inputText */ "./2D/controls/inputText.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__);
 
 
@@ -7373,7 +7373,7 @@ babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__["_TypeStore"].RegisteredTy
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputText", function() { return InputText; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../valueAndUnit */ "./2D/valueAndUnit.ts");
@@ -8386,7 +8386,7 @@ babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].RegisteredT
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Line", function() { return Line; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../valueAndUnit */ "./2D/valueAndUnit.ts");
@@ -8657,7 +8657,7 @@ babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].Registere
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultiLine", function() { return MultiLine; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/abstractMesh */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/abstractMesh */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _multiLinePoint__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../multiLinePoint */ "./2D/multiLinePoint.ts");
@@ -8927,7 +8927,7 @@ babylonjs_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_1__["_TypeStore"].Registe
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RadioButton", function() { return RadioButton; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
 /* harmony import */ var _stackPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stackPanel */ "./2D/controls/stackPanel.ts");
@@ -9134,7 +9134,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rectangle", function() { return Rectangle; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./container */ "./2D/controls/container.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__);
 
 
@@ -9284,7 +9284,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _scrollViewerWindow__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scrollViewerWindow */ "./2D/controls/scrollViewers/scrollViewerWindow.ts");
 /* harmony import */ var _sliders_scrollBar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../sliders/scrollBar */ "./2D/controls/sliders/scrollBar.ts");
 /* harmony import */ var _sliders_imageScrollBar__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sliders/imageScrollBar */ "./2D/controls/sliders/imageScrollBar.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_7__);
 
 
@@ -10898,7 +10898,7 @@ var SelectionPanel = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseSlider", function() { return BaseSlider; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../control */ "./2D/controls/control.ts");
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../valueAndUnit */ "./2D/valueAndUnit.ts");
@@ -11228,7 +11228,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _baseSlider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseSlider */ "./2D/controls/sliders/baseSlider.ts");
 /* harmony import */ var _measure__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../measure */ "./2D/measure.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_3__);
 
 
@@ -11821,7 +11821,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Slider", function() { return Slider; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _baseSlider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseSlider */ "./2D/controls/sliders/baseSlider.ts");
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__);
 
 
@@ -12076,7 +12076,7 @@ babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_2__["_TypeStore"].RegisteredTy
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StackPanel", function() { return StackPanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./container */ "./2D/controls/container.ts");
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
@@ -12344,7 +12344,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextWrapping", function() { return TextWrapping; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextBlock", function() { return TextBlock; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../valueAndUnit */ "./2D/valueAndUnit.ts");
 /* harmony import */ var _control__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./control */ "./2D/controls/control.ts");
@@ -12807,7 +12807,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeyPropertySet", function() { return KeyPropertySet; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualKeyboard", function() { return VirtualKeyboard; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _stackPanel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stackPanel */ "./2D/controls/stackPanel.ts");
 /* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./button */ "./2D/controls/button.ts");
@@ -13196,7 +13196,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Vector2WithInfo", function() { return Vector2WithInfo; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Matrix2D", function() { return Matrix2D; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__);
 
 
@@ -13421,7 +13421,7 @@ var Matrix2D = /** @class */ (function () {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Measure", function() { return Measure; });
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__);
 
 var tmpRect = [
@@ -13570,7 +13570,7 @@ var Measure = /** @class */ (function () {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultiLinePoint", function() { return MultiLinePoint; });
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./valueAndUnit */ "./2D/valueAndUnit.ts");
 
@@ -13713,7 +13713,7 @@ var MultiLinePoint = /** @class */ (function () {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Style", function() { return Style; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _valueAndUnit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./valueAndUnit */ "./2D/valueAndUnit.ts");
 
@@ -14019,7 +14019,7 @@ var ValueAndUnit = /** @class */ (function () {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "XmlLoader", function() { return XmlLoader; });
-/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_typeStore__WEBPACK_IMPORTED_MODULE_0__);
 
 /**
@@ -14338,7 +14338,7 @@ var XmlLoader = /** @class */ (function () {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AbstractButton3D", function() { return AbstractButton3D; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/transformNode */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/transformNode */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control3D */ "./3D/controls/control3D.ts");
 
@@ -14381,7 +14381,7 @@ var AbstractButton3D = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Button3D", function() { return Button3D; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _abstractButton3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./abstractButton3D */ "./3D/controls/abstractButton3D.ts");
 /* harmony import */ var _2D_advancedDynamicTexture__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../2D/advancedDynamicTexture */ "./2D/advancedDynamicTexture.ts");
@@ -14562,7 +14562,7 @@ var Button3D = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Container3D", function() { return Container3D; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/transformNode */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Meshes/transformNode */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_transformNode__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _control3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./control3D */ "./3D/controls/control3D.ts");
 
@@ -14719,7 +14719,7 @@ var Container3D = /** @class */ (function (_super) {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Control3D", function() { return Control3D; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _vector3WithInfo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../vector3WithInfo */ "./3D/vector3WithInfo.ts");
 
@@ -15125,7 +15125,7 @@ var Control3D = /** @class */ (function () {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CylinderPanel", function() { return CylinderPanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _volumeBasedPanel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./volumeBasedPanel */ "./3D/controls/volumeBasedPanel.ts");
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
@@ -15211,7 +15211,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HolographicButton", function() { return HolographicButton; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var _button3D__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./button3D */ "./3D/controls/button3D.ts");
-/* harmony import */ var babylonjs_Materials_standardMaterial__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Materials/standardMaterial */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Materials_standardMaterial__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Materials/standardMaterial */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Materials_standardMaterial__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_standardMaterial__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _materials_fluentMaterial__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../materials/fluentMaterial */ "./3D/materials/fluentMaterial.ts");
 /* harmony import */ var _2D_controls_stackPanel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../2D/controls/stackPanel */ "./2D/controls/stackPanel.ts");
@@ -15705,7 +15705,7 @@ var MeshButton3D = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlanePanel", function() { return PlanePanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
 /* harmony import */ var _volumeBasedPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./volumeBasedPanel */ "./3D/controls/volumeBasedPanel.ts");
@@ -15760,7 +15760,7 @@ var PlanePanel = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScatterPanel", function() { return ScatterPanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _volumeBasedPanel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./volumeBasedPanel */ "./3D/controls/volumeBasedPanel.ts");
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
@@ -15887,7 +15887,7 @@ var ScatterPanel = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SpherePanel", function() { return SpherePanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _volumeBasedPanel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./volumeBasedPanel */ "./3D/controls/volumeBasedPanel.ts");
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
@@ -15973,7 +15973,7 @@ var SpherePanel = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StackPanel3D", function() { return StackPanel3D; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
 
@@ -16098,7 +16098,7 @@ var StackPanel3D = /** @class */ (function (_super) {
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VolumeBasedPanel", function() { return VolumeBasedPanel; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _container3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./container3D */ "./3D/controls/container3D.ts");
 
@@ -16289,7 +16289,7 @@ var VolumeBasedPanel = /** @class */ (function (_super) {
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GUI3DManager", function() { return GUI3DManager; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _controls_container3D__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./controls/container3D */ "./3D/controls/container3D.ts");
 
@@ -16556,7 +16556,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FluentMaterialDefines", function() { return FluentMaterialDefines; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FluentMaterial", function() { return FluentMaterial; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/decorators */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Misc/decorators */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _shaders_fluent_vertex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shaders/fluent.vertex */ "./3D/materials/shaders/fluent.vertex.ts");
 /* harmony import */ var _shaders_fluent_fragment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shaders/fluent.fragment */ "./3D/materials/shaders/fluent.fragment.ts");
@@ -16879,7 +16879,7 @@ __webpack_require__.r(__webpack_exports__);
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fluentPixelShader", function() { return fluentPixelShader; });
-/* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/effect */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/effect */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
 
 var name = 'fluentPixelShader';
@@ -16901,7 +16901,7 @@ var fluentPixelShader = { name: name, shader: shader };
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fluentVertexShader", function() { return fluentVertexShader; });
-/* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/effect */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/effect */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
 
 var name = 'fluentVertexShader';
@@ -16924,7 +16924,7 @@ var fluentVertexShader = { name: name, shader: shader };
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Vector3WithInfo", function() { return Vector3WithInfo; });
 /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Maths/math.vector");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/perfCounter");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__);
 
 
@@ -17226,14 +17226,14 @@ if (typeof globalObject !== "undefined") {
 
 /***/ }),
 
-/***/ "babylonjs/Maths/math.vector":
+/***/ "babylonjs/Misc/perfCounter":
 /*!****************************************************************************************************!*\
   !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
   \****************************************************************************************************/
 /*! no static exports found */
 /***/ (function(module, exports) {
 
-module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Maths_math_vector__;
+module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_perfCounter__;
 
 /***/ })
 

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/gui/babylon.gui.js.map


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/inspector/babylon.inspector.bundle.js


+ 9 - 9
dist/preview release/inspector/babylon.inspector.bundle.max.js

@@ -40852,7 +40852,7 @@ var CheckBoxLineComponent = /** @class */ (function (_super) {
         else {
             if (this.props.onPropertyChangedObservable) {
                 this.props.onPropertyChangedObservable.notifyObservers({
-                    object: (_a = this.props.replaySourceReplacement, (_a !== null && _a !== void 0 ? _a : this.props.target)),
+                    object: (_a = this.props.replaySourceReplacement) !== null && _a !== void 0 ? _a : this.props.target,
                     property: this.props.propertyName,
                     value: !this.state.isSelected,
                     initialValue: this.state.isSelected
@@ -41341,7 +41341,7 @@ var FloatLineComponent = /** @class */ (function (_super) {
             return;
         }
         this.props.onPropertyChangedObservable.notifyObservers({
-            object: (_a = this.props.replaySourceReplacement, (_a !== null && _a !== void 0 ? _a : this.props.target)),
+            object: (_a = this.props.replaySourceReplacement) !== null && _a !== void 0 ? _a : this.props.target,
             property: this.props.propertyName,
             value: newValue,
             initialValue: previousValue
@@ -41496,7 +41496,7 @@ var MeshPickerComponent = /** @class */ (function (_super) {
                     }
                     if (_this.props.onPropertyChangedObservable) {
                         _this.props.onPropertyChangedObservable.notifyObservers({
-                            object: (_a = _this.props.replaySourceReplacement, (_a !== null && _a !== void 0 ? _a : _this.props.target)),
+                            object: (_a = _this.props.replaySourceReplacement) !== null && _a !== void 0 ? _a : _this.props.target,
                             property: _this.props.property,
                             value: _this.props.target[_this.props.property],
                             initialValue: currentState
@@ -41704,7 +41704,7 @@ var OptionsLineComponent = /** @class */ (function (_super) {
         return (react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "listLine" },
             react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "label" }, this.props.label),
             react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "options" },
-                react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("select", { onChange: function (evt) { return _this.updateValue(evt.target.value); }, value: (_a = this.state.value, (_a !== null && _a !== void 0 ? _a : "")) }, this.props.options.map(function (option) {
+                react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("select", { onChange: function (evt) { return _this.updateValue(evt.target.value); }, value: (_a = this.state.value) !== null && _a !== void 0 ? _a : "" }, this.props.options.map(function (option) {
                     return (react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("option", { key: option.label, value: option.value }, option.label));
                 })))));
     };
@@ -41972,7 +41972,7 @@ var SliderLineComponent = /** @class */ (function (_super) {
         if (this.props.target) {
             if (this.props.onPropertyChangedObservable) {
                 this.props.onPropertyChangedObservable.notifyObservers({
-                    object: (_a = this.props.replaySourceReplacement, (_a !== null && _a !== void 0 ? _a : this.props.target)),
+                    object: (_a = this.props.replaySourceReplacement) !== null && _a !== void 0 ? _a : this.props.target,
                     property: this.props.propertyName,
                     value: newValue,
                     initialValue: this.state.value
@@ -42697,7 +42697,7 @@ var Vector3LineComponent = /** @class */ (function (_super) {
             return;
         }
         this.props.onPropertyChangedObservable.notifyObservers({
-            object: (_a = this.props.replaySourceReplacement, (_a !== null && _a !== void 0 ? _a : this.props.target)),
+            object: (_a = this.props.replaySourceReplacement) !== null && _a !== void 0 ? _a : this.props.target,
             property: this.props.propertyName,
             value: this.state.value,
             initialValue: previousValue
@@ -45387,7 +45387,7 @@ var CommonMaterialPropertyGridComponent = /** @class */ (function (_super) {
         var _this = this;
         var _a;
         var material = this.props.material;
-        material.depthFunction = (_a = material.depthFunction, (_a !== null && _a !== void 0 ? _a : 0));
+        material.depthFunction = (_a = material.depthFunction) !== null && _a !== void 0 ? _a : 0;
         var orientationOptions = [
             { label: "Clockwise", value: babylonjs_Materials_material__WEBPACK_IMPORTED_MODULE_2__["Material"].ClockWiseSideOrientation },
             { label: "Counterclockwise", value: babylonjs_Materials_material__WEBPACK_IMPORTED_MODULE_2__["Material"].CounterClockWiseSideOrientation }
@@ -45822,8 +45822,8 @@ var PBRMaterialPropertyGridComponent = /** @class */ (function (_super) {
             { label: "Luminance Over Alpha", value: 86 },
             { label: "Alpha", value: 87 },
         ];
-        material.sheen._useRoughness = (_a = material.sheen._useRoughness, (_a !== null && _a !== void 0 ? _a : material.sheen.roughness !== null));
-        material.sheen.roughness = (_c = (_b = material.sheen.roughness, (_b !== null && _b !== void 0 ? _b : material.sheen._saveRoughness)), (_c !== null && _c !== void 0 ? _c : 0));
+        material.sheen._useRoughness = (_a = material.sheen._useRoughness) !== null && _a !== void 0 ? _a : material.sheen.roughness !== null;
+        material.sheen.roughness = (_c = (_b = material.sheen.roughness) !== null && _b !== void 0 ? _b : material.sheen._saveRoughness) !== null && _c !== void 0 ? _c : 0;
         if (!material.sheen._useRoughness) {
             material.sheen._saveRoughness = material.sheen.roughness;
             material.sheen.roughness = null;

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/inspector/babylon.inspector.bundle.max.js.map


+ 1 - 1
dist/preview release/inspector/babylon.inspector.d.ts

@@ -2146,7 +2146,7 @@ declare module INSPECTOR {
         private static _CreateSceneExplorer;
         private static _CreateActionTabs;
         private static _CreateEmbedHost;
-        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): BABYLON.Nullable<HTMLDivElement>;
+        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         static get IsVisible(): boolean;
         static EarlyAttachToLoader(): void;
         static Show(scene: BABYLON.Scene, userOptions: Partial<BABYLON.IInspectorOptions>): void;

+ 2 - 3
dist/preview release/inspector/babylon.inspector.module.d.ts

@@ -2687,7 +2687,6 @@ declare module "babylonjs-inspector/components/embedHost/embedHostComponent" {
 }
 declare module "babylonjs-inspector/inspector" {
     import { IInspectorOptions } from "babylonjs/Debug/debugLayer";
-    import { Nullable } from "babylonjs/types";
     import { Observable } from "babylonjs/Misc/observable";
     import { Scene } from "babylonjs/scene";
     import { PropertyChangedEvent } from "babylonjs-inspector/components/propertyChangedEvent";
@@ -2710,7 +2709,7 @@ declare module "babylonjs-inspector/inspector" {
         private static _CreateSceneExplorer;
         private static _CreateActionTabs;
         private static _CreateEmbedHost;
-        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): Nullable<HTMLDivElement>;
+        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         static get IsVisible(): boolean;
         static EarlyAttachToLoader(): void;
         static Show(scene: Scene, userOptions: Partial<IInspectorOptions>): void;
@@ -4878,7 +4877,7 @@ declare module INSPECTOR {
         private static _CreateSceneExplorer;
         private static _CreateActionTabs;
         private static _CreateEmbedHost;
-        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): BABYLON.Nullable<HTMLDivElement>;
+        static _CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         static get IsVisible(): boolean;
         static EarlyAttachToLoader(): void;
         static Show(scene: BABYLON.Scene, userOptions: Partial<BABYLON.IInspectorOptions>): void;

+ 2 - 0
dist/preview release/loaders/babylon.glTF2FileLoader.js

@@ -2605,7 +2605,9 @@ var GLTFLoader = /** @class */ (function () {
             }));
         }
         else {
+            this._babylonScene._blockEntityCollection = this._forAssetContainer;
             node._babylonTransformNode = new babylonjs_Misc_deferred__WEBPACK_IMPORTED_MODULE_0__["TransformNode"](name, this._babylonScene);
+            this._babylonScene._blockEntityCollection = false;
             node._primitiveBabylonMeshes = [];
             for (var _i = 0, primitives_1 = primitives; _i < primitives_1.length; _i++) {
                 var primitive = primitives_1[_i];

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/loaders/babylon.glTF2FileLoader.js.map


Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/loaders/babylon.glTF2FileLoader.min.js


+ 2 - 0
dist/preview release/loaders/babylon.glTFFileLoader.js

@@ -5185,7 +5185,9 @@ var GLTFLoader = /** @class */ (function () {
             }));
         }
         else {
+            this._babylonScene._blockEntityCollection = this._forAssetContainer;
             node._babylonTransformNode = new babylonjs_Misc_deferred__WEBPACK_IMPORTED_MODULE_0__["TransformNode"](name, this._babylonScene);
+            this._babylonScene._blockEntityCollection = false;
             node._primitiveBabylonMeshes = [];
             for (var _i = 0, primitives_1 = primitives; _i < primitives_1.length; _i++) {
                 var primitive = primitives_1[_i];

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/loaders/babylon.glTFFileLoader.js.map


Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/preview release/loaders/babylon.glTFFileLoader.min.js


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

@@ -6565,7 +6565,9 @@ var GLTFLoader = /** @class */ (function () {
             }));
         }
         else {
+            this._babylonScene._blockEntityCollection = this._forAssetContainer;
             node._babylonTransformNode = new babylonjs_Misc_deferred__WEBPACK_IMPORTED_MODULE_0__["TransformNode"](name, this._babylonScene);
+            this._babylonScene._blockEntityCollection = false;
             node._primitiveBabylonMeshes = [];
             for (var _i = 0, primitives_1 = primitives; _i < primitives_1.length; _i++) {
                 var primitive = primitives_1[_i];

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/loaders/babylonjs.loaders.js.map


Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/preview release/loaders/babylonjs.loaders.min.js


+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.d.ts

@@ -1395,7 +1395,7 @@ declare module NODEEDITOR {
 }
 declare module NODEEDITOR {
     export class Popup {
-        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): Nullable<HTMLDivElement>;
+        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         private static _CopyStyles;
     }
 }

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.js


+ 3 - 5
dist/preview release/nodeEditor/babylon.nodeEditor.max.js

@@ -53730,14 +53730,12 @@ var GraphCanvasComponent = /** @class */ (function (_super) {
             _this._candidatePort = port;
         });
         props.globalState.onFramePortMoveUpObserver.add(function (nodePort) {
-            var _a;
             var frame = _this._frames.find(function (frame) { return frame.id === nodePort.frameId; });
-            (_a = frame) === null || _a === void 0 ? void 0 : _a.moveFramePortUp(nodePort);
+            frame === null || frame === void 0 ? void 0 : frame.moveFramePortUp(nodePort);
         });
         props.globalState.onFramePortMoveDownObserver.add(function (nodePort) {
-            var _a;
             var frame = _this._frames.find(function (frame) { return frame.id === nodePort.frameId; });
-            (_a = frame) === null || _a === void 0 ? void 0 : _a.moveFramePortDown(nodePort);
+            frame === null || frame === void 0 ? void 0 : frame.moveFramePortDown(nodePort);
         });
         props.globalState.onGridSizeChanged.add(function () {
             _this.gridSize = babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2__["DataStorage"].ReadNumber("GridSize", 20);
@@ -59479,7 +59477,7 @@ var OptionsLineComponent = /** @class */ (function (_super) {
         return (react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "listLine" },
             react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "label" }, this.props.label),
             react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("div", { className: "options" + (this.props.className ? " " + this.props.className : "") },
-                react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("select", { onChange: function (evt) { return _this.updateValue(evt.target.value); }, value: (_a = this.state.value, (_a !== null && _a !== void 0 ? _a : "")) }, this.props.options.map(function (option) {
+                react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("select", { onChange: function (evt) { return _this.updateValue(evt.target.value); }, value: (_a = this.state.value) !== null && _a !== void 0 ? _a : "" }, this.props.options.map(function (option) {
                     return (react__WEBPACK_IMPORTED_MODULE_1__["createElement"]("option", { key: option.label, value: option.value }, option.label));
                 })))));
     };

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map


+ 2 - 2
dist/preview release/nodeEditor/babylon.nodeEditor.module.d.ts

@@ -1670,7 +1670,7 @@ declare module "babylonjs-node-editor/graphEditor" {
 }
 declare module "babylonjs-node-editor/sharedComponents/popup" {
     export class Popup {
-        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): import("babylonjs/types").Nullable<HTMLDivElement>;
+        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         private static _CopyStyles;
     }
 }
@@ -3107,7 +3107,7 @@ declare module NODEEDITOR {
 }
 declare module NODEEDITOR {
     export class Popup {
-        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): Nullable<HTMLDivElement>;
+        static CreatePopup(title: string, windowVariableName: string, width?: number, height?: number): HTMLDivElement | null;
         private static _CopyStyles;
     }
 }

+ 1 - 1
dist/preview release/packagesSizeBaseLine.json

@@ -1 +1 @@
-{"thinEngineOnly":113465,"engineOnly":150094,"sceneOnly":507272,"minGridMaterial":639135,"minStandardMaterial":779955}
+{"thinEngineOnly":114605,"engineOnly":151234,"sceneOnly":508412,"minGridMaterial":640273,"minStandardMaterial":781344}

+ 377 - 84
dist/preview release/viewer/babylon.module.d.ts

@@ -1193,6 +1193,10 @@ declare module "babylonjs/Engines/Processors/Expressions/shaderDefineExpression"
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module "babylonjs/Engines/Processors/shaderCodeTestNode" {
@@ -50444,18 +50448,18 @@ declare module "babylonjs/Gamepads/Controllers/windowsMotionController" {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -50563,18 +50567,18 @@ declare module "babylonjs/Gamepads/Controllers/windowsMotionController" {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -53340,6 +53344,139 @@ declare module "babylonjs/Shaders/ShadersInclude/pbrIBLFunctions" {
         shader: string;
     };
 }
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAlbedoOpacity" {
+    /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectivity" {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAmbientOcclusion" {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAlphaFresnel" {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockAnisotropic" {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflection" {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockSheen" {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockClearcoat" {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockSubSurface" {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockNormalGeometric" {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockNormalFinal" {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockGeometryInfo" {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance0" {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance" {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockDirectLighting" {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalLitComponents" {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents" {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockFinalColorComposition" {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module "babylonjs/Shaders/ShadersInclude/pbrBlockImageProcessing" {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
 declare module "babylonjs/Shaders/ShadersInclude/pbrDebug" {
     /** @hidden */
     export var pbrDebug: {
@@ -53370,12 +53507,31 @@ declare module "babylonjs/Shaders/pbr.fragment" {
     import "babylonjs/Shaders/ShadersInclude/pbrIBLFunctions";
     import "babylonjs/Shaders/ShadersInclude/bumpFragmentFunctions";
     import "babylonjs/Shaders/ShadersInclude/reflectionFunction";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAlbedoOpacity";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectivity";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAmbientOcclusion";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAlphaFresnel";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockAnisotropic";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflection";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockSheen";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockClearcoat";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockSubSurface";
     import "babylonjs/Shaders/ShadersInclude/clipPlaneFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockNormalGeometric";
     import "babylonjs/Shaders/ShadersInclude/bumpFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockNormalFinal";
     import "babylonjs/Shaders/ShadersInclude/depthPrePass";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockGeometryInfo";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance0";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockReflectance";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockDirectLighting";
     import "babylonjs/Shaders/ShadersInclude/lightFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalLitComponents";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockFinalColorComposition";
     import "babylonjs/Shaders/ShadersInclude/logDepthFragment";
     import "babylonjs/Shaders/ShadersInclude/fogFragment";
+    import "babylonjs/Shaders/ShadersInclude/pbrBlockImageProcessing";
     import "babylonjs/Shaders/ShadersInclude/pbrDebug";
     /** @hidden */
     export var pbrPixelShader: {
@@ -73791,52 +73947,52 @@ declare module "babylonjs/XR/motionController/webXRMicrosoftMixedRealityControll
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };
@@ -75305,6 +75461,10 @@ declare module BABYLON {
         isTrue(preprocessors: {
             [key: string]: string;
         }): boolean;
+        private static OperatorPriority;
+        private static Stack;
+        static postfixToInfix(postfix: string[]): string;
+        static infixToPostfix(infix: string): string[];
     }
 }
 declare module BABYLON {
@@ -122639,18 +122799,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -122758,18 +122918,18 @@ declare module BABYLON {
         protected readonly _mapping: {
             buttons: string[];
             buttonMeshNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             buttonObservableNames: {
-                'trigger': string;
-                'menu': string;
-                'grip': string;
-                'thumbstick': string;
-                'trackpad': string;
+                trigger: string;
+                menu: string;
+                grip: string;
+                thumbstick: string;
+                trackpad: string;
             };
             axisMeshNames: string[];
             pointingPoseMeshName: string;
@@ -125325,6 +125485,139 @@ declare module BABYLON {
 }
 declare module BABYLON {
     /** @hidden */
+    export var pbrBlockAlbedoOpacity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectivity: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAmbientOcclusion: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAlphaFresnel: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockAnisotropic: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflection: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSheen: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockClearcoat: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockSubSurface: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalGeometric: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockNormalFinal: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockGeometryInfo: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance0: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockReflectance: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockDirectLighting: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalLitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalUnlitComponents: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockFinalColorComposition: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
+    export var pbrBlockImageProcessing: {
+        name: string;
+        shader: string;
+    };
+}
+declare module BABYLON {
+    /** @hidden */
     export var pbrDebug: {
         name: string;
         shader: string;
@@ -144131,52 +144424,52 @@ declare module BABYLON {
     export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
         protected readonly _mapping: {
             defaultButton: {
-                "valueNodeName": string;
-                "unpressedNodeName": string;
-                "pressedNodeName": string;
+                valueNodeName: string;
+                unpressedNodeName: string;
+                pressedNodeName: string;
             };
             defaultAxis: {
-                "valueNodeName": string;
-                "minNodeName": string;
-                "maxNodeName": string;
+                valueNodeName: string;
+                minNodeName: string;
+                maxNodeName: string;
             };
             buttons: {
                 "xr-standard-trigger": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-squeeze": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
                 "xr-standard-touchpad": {
-                    "rootNodeName": string;
-                    "labelAnchorNodeName": string;
-                    "touchPointNodeName": string;
+                    rootNodeName: string;
+                    labelAnchorNodeName: string;
+                    touchPointNodeName: string;
                 };
                 "xr-standard-thumbstick": {
-                    "rootNodeName": string;
-                    "componentProperty": string;
-                    "states": string[];
+                    rootNodeName: string;
+                    componentProperty: string;
+                    states: string[];
                 };
             };
             axes: {
                 "xr-standard-touchpad": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
                 "xr-standard-thumbstick": {
                     "x-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                     "y-axis": {
-                        "rootNodeName": string;
+                        rootNodeName: string;
                     };
                 };
             };

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

@@ -3,35 +3,35 @@
 /// <reference path="./babylonjs.loaders.module.d.ts"/>
 // Generated by dts-bundle v0.7.3
 // Dependencies for this module:
-//   ../../../../../Tools/Gulp/babylonjs
-//   ../../../../../Tools/Gulp/babylonjs-loaders
-//   ../../../../../Tools/Gulp/babylonjs/Misc/observable
-//   ../../../../../Tools/Gulp/babylonjs/Engines/engine
-//   ../../../../../Tools/Gulp/babylonjs/Loading/sceneLoader
-//   ../../../../../Tools/Gulp/babylonjs/scene
-//   ../../../../../Tools/Gulp/babylonjs/Meshes/abstractMesh
-//   ../../../../../Tools/Gulp/babylonjs/Particles/IParticleSystem
-//   ../../../../../Tools/Gulp/babylonjs/Bones/skeleton
-//   ../../../../../Tools/Gulp/babylonjs/Animations/animationGroup
-//   ../../../../../Tools/Gulp/babylonjs/Animations/index
-//   ../../../../../Tools/Gulp/babylonjs/types
-//   ../../../../../Tools/Gulp/babylonjs/Materials/material
-//   ../../../../../Tools/Gulp/babylonjs-gltf2interface
-//   ../../../../../Tools/Gulp/babylonjs/Maths/math.vector
-//   ../../../../../Tools/Gulp/babylonjs-loaders/glTF/glTFFileLoader
-//   ../../../../../Tools/Gulp/babylonjs/Materials/Textures/baseTexture
-//   ../../../../../Tools/Gulp/babylonjs/Engines/thinEngine
-//   ../../../../../Tools/Gulp/babylonjs/Maths/math
-//   ../../../../../Tools/Gulp/babylonjs/Misc/sceneOptimizer
-//   ../../../../../Tools/Gulp/babylonjs/Cameras/arcRotateCamera
-//   ../../../../../Tools/Gulp/babylonjs/Lights/light
-//   ../../../../../Tools/Gulp/babylonjs/Helpers/environmentHelper
-//   ../../../../../Tools/Gulp/babylonjs/Cameras/VR/vrExperienceHelper
-//   ../../../../../Tools/Gulp/babylonjs/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline
-//   ../../../../../Tools/Gulp/babylonjs/Lights/shadowLight
-//   ../../../../../Tools/Gulp/babylonjs-loaders/glTF/2.0/glTFLoaderExtension
-//   ../../../../../Tools/Gulp/babylonjs/PostProcesses/depthOfFieldEffect
-//   ../../../../../Tools/Gulp/babylonjs/Materials/Textures/cubeTexture
+//   ../../../../../tools/Gulp/babylonjs
+//   ../../../../../tools/Gulp/babylonjs-loaders
+//   ../../../../../tools/Gulp/babylonjs/Misc/observable
+//   ../../../../../tools/Gulp/babylonjs/Engines/engine
+//   ../../../../../tools/Gulp/babylonjs/Loading/sceneLoader
+//   ../../../../../tools/Gulp/babylonjs/scene
+//   ../../../../../tools/Gulp/babylonjs/Meshes/abstractMesh
+//   ../../../../../tools/Gulp/babylonjs/Particles/IParticleSystem
+//   ../../../../../tools/Gulp/babylonjs/Bones/skeleton
+//   ../../../../../tools/Gulp/babylonjs/Animations/animationGroup
+//   ../../../../../tools/Gulp/babylonjs/Animations/index
+//   ../../../../../tools/Gulp/babylonjs/types
+//   ../../../../../tools/Gulp/babylonjs/Materials/material
+//   ../../../../../tools/Gulp/babylonjs-gltf2interface
+//   ../../../../../tools/Gulp/babylonjs/Maths/math.vector
+//   ../../../../../tools/Gulp/babylonjs-loaders/glTF/glTFFileLoader
+//   ../../../../../tools/Gulp/babylonjs/Materials/Textures/baseTexture
+//   ../../../../../tools/Gulp/babylonjs/Engines/thinEngine
+//   ../../../../../tools/Gulp/babylonjs/Maths/math
+//   ../../../../../tools/Gulp/babylonjs/Misc/sceneOptimizer
+//   ../../../../../tools/Gulp/babylonjs/Cameras/arcRotateCamera
+//   ../../../../../tools/Gulp/babylonjs/Lights/light
+//   ../../../../../tools/Gulp/babylonjs/Helpers/environmentHelper
+//   ../../../../../tools/Gulp/babylonjs/Cameras/VR/vrExperienceHelper
+//   ../../../../../tools/Gulp/babylonjs/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline
+//   ../../../../../tools/Gulp/babylonjs/Lights/shadowLight
+//   ../../../../../tools/Gulp/babylonjs-loaders/glTF/2.0/glTFLoaderExtension
+//   ../../../../../tools/Gulp/babylonjs/PostProcesses/depthOfFieldEffect
+//   ../../../../../tools/Gulp/babylonjs/Materials/Textures/cubeTexture
 declare module BabylonViewer {
     /**
         * BabylonJS Viewer

Файловите разлики са ограничени, защото са твърде много
+ 341 - 265
dist/preview release/viewer/babylon.viewer.js


Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
dist/preview release/viewer/babylon.viewer.max.js


+ 29 - 29
dist/preview release/viewer/babylon.viewer.module.d.ts

@@ -4,35 +4,35 @@
 
 // Generated by dts-bundle v0.7.3
 // Dependencies for this module:
-//   ../../../../../Tools/Gulp/babylonjs
-//   ../../../../../Tools/Gulp/babylonjs-loaders
-//   ../../../../../Tools/Gulp/babylonjs/Misc/observable
-//   ../../../../../Tools/Gulp/babylonjs/Engines/engine
-//   ../../../../../Tools/Gulp/babylonjs/Loading/sceneLoader
-//   ../../../../../Tools/Gulp/babylonjs/scene
-//   ../../../../../Tools/Gulp/babylonjs/Meshes/abstractMesh
-//   ../../../../../Tools/Gulp/babylonjs/Particles/IParticleSystem
-//   ../../../../../Tools/Gulp/babylonjs/Bones/skeleton
-//   ../../../../../Tools/Gulp/babylonjs/Animations/animationGroup
-//   ../../../../../Tools/Gulp/babylonjs/Animations/index
-//   ../../../../../Tools/Gulp/babylonjs/types
-//   ../../../../../Tools/Gulp/babylonjs/Materials/material
-//   ../../../../../Tools/Gulp/babylonjs-gltf2interface
-//   ../../../../../Tools/Gulp/babylonjs/Maths/math.vector
-//   ../../../../../Tools/Gulp/babylonjs-loaders/glTF/glTFFileLoader
-//   ../../../../../Tools/Gulp/babylonjs/Materials/Textures/baseTexture
-//   ../../../../../Tools/Gulp/babylonjs/Engines/thinEngine
-//   ../../../../../Tools/Gulp/babylonjs/Maths/math
-//   ../../../../../Tools/Gulp/babylonjs/Misc/sceneOptimizer
-//   ../../../../../Tools/Gulp/babylonjs/Cameras/arcRotateCamera
-//   ../../../../../Tools/Gulp/babylonjs/Lights/light
-//   ../../../../../Tools/Gulp/babylonjs/Helpers/environmentHelper
-//   ../../../../../Tools/Gulp/babylonjs/Cameras/VR/vrExperienceHelper
-//   ../../../../../Tools/Gulp/babylonjs/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline
-//   ../../../../../Tools/Gulp/babylonjs/Lights/shadowLight
-//   ../../../../../Tools/Gulp/babylonjs-loaders/glTF/2.0/glTFLoaderExtension
-//   ../../../../../Tools/Gulp/babylonjs/PostProcesses/depthOfFieldEffect
-//   ../../../../../Tools/Gulp/babylonjs/Materials/Textures/cubeTexture
+//   ../../../../../tools/Gulp/babylonjs
+//   ../../../../../tools/Gulp/babylonjs-loaders
+//   ../../../../../tools/Gulp/babylonjs/Misc/observable
+//   ../../../../../tools/Gulp/babylonjs/Engines/engine
+//   ../../../../../tools/Gulp/babylonjs/Loading/sceneLoader
+//   ../../../../../tools/Gulp/babylonjs/scene
+//   ../../../../../tools/Gulp/babylonjs/Meshes/abstractMesh
+//   ../../../../../tools/Gulp/babylonjs/Particles/IParticleSystem
+//   ../../../../../tools/Gulp/babylonjs/Bones/skeleton
+//   ../../../../../tools/Gulp/babylonjs/Animations/animationGroup
+//   ../../../../../tools/Gulp/babylonjs/Animations/index
+//   ../../../../../tools/Gulp/babylonjs/types
+//   ../../../../../tools/Gulp/babylonjs/Materials/material
+//   ../../../../../tools/Gulp/babylonjs-gltf2interface
+//   ../../../../../tools/Gulp/babylonjs/Maths/math.vector
+//   ../../../../../tools/Gulp/babylonjs-loaders/glTF/glTFFileLoader
+//   ../../../../../tools/Gulp/babylonjs/Materials/Textures/baseTexture
+//   ../../../../../tools/Gulp/babylonjs/Engines/thinEngine
+//   ../../../../../tools/Gulp/babylonjs/Maths/math
+//   ../../../../../tools/Gulp/babylonjs/Misc/sceneOptimizer
+//   ../../../../../tools/Gulp/babylonjs/Cameras/arcRotateCamera
+//   ../../../../../tools/Gulp/babylonjs/Lights/light
+//   ../../../../../tools/Gulp/babylonjs/Helpers/environmentHelper
+//   ../../../../../tools/Gulp/babylonjs/Cameras/VR/vrExperienceHelper
+//   ../../../../../tools/Gulp/babylonjs/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline
+//   ../../../../../tools/Gulp/babylonjs/Lights/shadowLight
+//   ../../../../../tools/Gulp/babylonjs-loaders/glTF/2.0/glTFLoaderExtension
+//   ../../../../../tools/Gulp/babylonjs/PostProcesses/depthOfFieldEffect
+//   ../../../../../tools/Gulp/babylonjs/Materials/Textures/cubeTexture
 
 declare module 'babylonjs-viewer' {
     import { mapperManager } from 'babylonjs-viewer/configuration/mappers';

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

@@ -58,12 +58,13 @@
 - Added to `FresnelParameters` constructor options and equals method ([brianzinn](https://github.com/brianzinn))
 - Added `AddAttribute` to `CustomMaterial` and `PBRCustomMaterial` ([Popov72](https://github.com/Popov72))
 - `setTexture` and `setTextureArray` from `ShaderMaterial` take now a `BaseTexture` as input instead of a `Texture`, allowing to pass a `CubeTexture` ([Popov72](https://github.com/Popov72))
+- Allow parenthesis usage in `#if` expressions in shader code ([Popov72](https://github.com/Popov72))
 
 ### WebXR
 
 - Added optional ray and mesh selection predicates to `WebXRControllerPointerSelection` ([Exolun](https://github.com/Exolun))
 - Implemented the new WebXR HitTest API ([#7364](https://github.com/BabylonJS/Babylon.js/issues/7364)) ([RaananW](https://github.com/RaananW))
-- Playground doesn't update FPS when in XR ([#7875](https://github.com/BabylonJS/Babylon.js/issues/7875)) ([RaananW](https://github.com/RaananW))
+- Playground doesn't update FPS when in XR in main and frame ([#7875](https://github.com/BabylonJS/Babylon.js/issues/7875)) ([RaananW](https://github.com/RaananW))
 
 ### Collisions
 
@@ -93,5 +94,9 @@
 - Fix bug in PBR with translucency when irradiance texture is 2D ([Popov72](https://github.com/Popov72)
 - Fix bug in PBR when specific combinations of parameters are used ([Popov72](https://github.com/Popov72)
 - Fix texture being inverted on the Y axis by default when using TextureAsset or AssetManager ([broederj](https://github.com/broederj))
+- Fix `TexturePacker` cross-origin image requests, fix falsy default options ([ludevik](https://github.com/ludevik))
+- Fix freeze (infinite loop) when disposing a scene that loaded some specific gLTF files ([Popov72](https://github.com/Popov72)
+
+- Fix submesh recreation when it should not ([Popov72](https://github.com/Popov72)
 
 ## Breaking changes

+ 2 - 0
loaders/src/glTF/2.0/glTFLoader.ts

@@ -733,7 +733,9 @@ export class GLTFLoader implements IGLTFLoader {
             }));
         }
         else {
+            this._babylonScene._blockEntityCollection = this._forAssetContainer;
             node._babylonTransformNode = new TransformNode(name, this._babylonScene);
+            this._babylonScene._blockEntityCollection = false;
             node._primitiveBabylonMeshes = [];
             for (const primitive of primitives) {
                 promises.push(this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, (babylonMesh) => {

+ 2 - 2
package.json

@@ -98,7 +98,7 @@
         "tslib": "^1.10.0",
         "tslint": "^5.11.0",
         "typedoc": "^0.15.4",
-        "typescript": "~3.7.5",
+        "typescript": "~3.8.3",
         "webpack": "^4.29.3",
         "webpack-bundle-analyzer": "^3.1.0",
         "webpack-cli": "^3.3.9",
@@ -107,4 +107,4 @@
         "xhr2": "^0.1.4",
         "xmlbuilder": "8.2.2"
     }
-}
+}

+ 92 - 0
src/Engines/Processors/Expressions/shaderDefineExpression.ts

@@ -3,4 +3,96 @@ export class ShaderDefineExpression {
     public isTrue(preprocessors: { [key: string]: string }): boolean {
         return true;
     }
+
+    private static OperatorPriority: { [name: string]: number } = {
+        ")": 0,
+        "(": 1,
+        "||": 2,
+        "&&": 3,
+    };
+
+    private static Stack = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
+
+    public static postfixToInfix(postfix: string[]): string {
+        const stack: string[] = [];
+
+        for (let c of postfix) {
+            if (ShaderDefineExpression.OperatorPriority[c] === undefined) {
+                stack.push(c);
+            } else {
+                const v1 = stack[stack.length - 1],
+                      v2 = stack[stack.length - 2];
+
+                stack.length -= 2;
+                stack.push(`(${v2}${c}${v1})`);
+            }
+        }
+
+        return stack[stack.length - 1];
+    }
+
+    public static infixToPostfix(infix: string): string[] {
+        const result: string[] = [];
+
+        let stackIdx = -1;
+
+        const pushOperand = () => {
+            operand = operand.trim();
+            if (operand !== '') {
+                result.push(operand);
+                operand = '';
+            }
+        };
+
+        const push = (s: string) => {
+            if (stackIdx < ShaderDefineExpression.Stack.length - 1) {
+                ShaderDefineExpression.Stack[++stackIdx] = s;
+            }
+        };
+
+        const peek = () => ShaderDefineExpression.Stack[stackIdx];
+
+        const pop = () => stackIdx === -1 ? '!!INVALID EXPRESSION!!' : ShaderDefineExpression.Stack[stackIdx--];
+
+        let idx = 0,
+            operand = '';
+
+        while (idx < infix.length) {
+            const c = infix.charAt(idx),
+                  token = idx < infix.length - 1 ? infix.substr(idx, 2) : '';
+
+            if (c === '(') {
+                operand = '';
+                push(c);
+            } else if (c === ')') {
+                pushOperand();
+                while (stackIdx !== -1 && peek() !== '(') {
+                    result.push(pop());
+                }
+                pop();
+            } else if (ShaderDefineExpression.OperatorPriority[token] > 1) {
+                pushOperand();
+                while (stackIdx !== -1 && ShaderDefineExpression.OperatorPriority[peek()] >= ShaderDefineExpression.OperatorPriority[token]) {
+                    result.push(pop());
+                }
+                push(token);
+                idx++;
+            } else {
+                operand += c;
+            }
+            idx++;
+        }
+
+        pushOperand();
+
+        while (stackIdx !== -1) {
+            if (peek() === '(') {
+                pop();
+            } else {
+                result.push(pop());
+            }
+        }
+
+        return result;
+    }
 }

+ 40 - 21
src/Engines/Processors/shaderProcessor.ts

@@ -15,6 +15,9 @@ declare type LoadFileError = import("../../Misc/fileTools").LoadFileError;
 declare type IOfflineProvider = import("../../Offline/IOfflineProvider").IOfflineProvider;
 declare type IFileRequest  = import("../../Misc/fileRequest").IFileRequest;
 
+const regexSE = /defined\s*?\((.+?)\)/g;
+const regexSERevert = /defined\s*?\[(.+?)\]/g;
+
 /** @hidden */
 export class ShaderProcessor {
     public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string) => void) {
@@ -74,31 +77,47 @@ export class ShaderProcessor {
     }
 
     private static _BuildSubExpression(expression: string): ShaderDefineExpression {
-        let indexOr = expression.indexOf("||");
-        if (indexOr === -1) {
-            let indexAnd = expression.indexOf("&&");
-            if (indexAnd > -1) {
-                let andOperator = new ShaderDefineAndOperator();
-                let leftPart = expression.substring(0, indexAnd).trim();
-                let rightPart = expression.substring(indexAnd + 2).trim();
-
-                andOperator.leftOperand = this._BuildSubExpression(leftPart);
-                andOperator.rightOperand = this._BuildSubExpression(rightPart);
-
-                return andOperator;
-            } else {
-                return this._ExtractOperation(expression);
+        expression = expression.replace(regexSE, "defined[$1]");
+
+        const postfix = ShaderDefineExpression.infixToPostfix(expression);
+
+        const stack: (string | ShaderDefineExpression)[] = [];
+
+        for (let c of postfix) {
+            if (c !== '||' && c !== '&&') {
+                stack.push(c);
+            } else if (stack.length >= 2) {
+                let v1 = stack[stack.length - 1],
+                    v2 = stack[stack.length - 2];
+
+                stack.length -= 2;
+
+                let operator = c == '&&' ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator();
+
+                if (typeof(v1) === 'string') {
+                    v1 = v1.replace(regexSERevert, "defined($1)");
+                }
+
+                if (typeof(v2) === 'string') {
+                    v2 = v2.replace(regexSERevert, "defined($1)");
+                }
+
+                operator.leftOperand = typeof(v2) === 'string' ? this._ExtractOperation(v2) : v2;
+                operator.rightOperand = typeof(v1) === 'string' ? this._ExtractOperation(v1) : v1;
+
+                stack.push(operator);
             }
-        } else {
-            let orOperator = new ShaderDefineOrOperator();
-            let leftPart = expression.substring(0, indexOr).trim();
-            let rightPart = expression.substring(indexOr + 2).trim();
+        }
 
-            orOperator.leftOperand = this._BuildSubExpression(leftPart);
-            orOperator.rightOperand = this._BuildSubExpression(rightPart);
+        let result = stack[stack.length - 1];
 
-            return orOperator;
+        if (typeof(result) === 'string') {
+            result = result.replace(regexSERevert, "defined($1)");
         }
+
+        // note: stack.length !== 1 if there was an error in the parsing
+
+        return typeof(result) === 'string' ? this._ExtractOperation(result) : result;
     }
 
     private static _BuildExpression(line: string, start: number): ShaderCodeTestNode {

+ 15 - 13
src/Materials/Textures/Packer/packer.ts

@@ -10,6 +10,7 @@ import { Vector2 } from "../../../Maths/math.vector";
 import { Color3, Color4 } from "../../../Maths/math.color";
 import { TexturePackerFrame } from "./frame";
 import { Logger } from "../../../Misc/logger";
+import { Tools } from '../../../Misc/tools';
 
 /**
 * Defines the basic options interface of a TexturePacker
@@ -175,7 +176,7 @@ export class TexturePacker{
          * Run through the options and set what ever defaults are needed that where not declared.
          */
         this.options = options;
-        this.options.map = this.options.map || [
+        this.options.map = this.options.map ?? [
                 'ambientTexture',
                 'bumpTexture',
                 'diffuseTexture',
@@ -187,26 +188,26 @@ export class TexturePacker{
                 'specularTexture'
             ];
 
-        this.options.uvsIn = this.options.uvsIn || VertexBuffer.UVKind;
-        this.options.uvsOut = this.options.uvsOut || VertexBuffer.UVKind;
-        this.options.layout = this.options.layout || TexturePacker.LAYOUT_STRIP;
+        this.options.uvsIn = this.options.uvsIn ?? VertexBuffer.UVKind;
+        this.options.uvsOut = this.options.uvsOut ?? VertexBuffer.UVKind;
+        this.options.layout = this.options.layout ?? TexturePacker.LAYOUT_STRIP;
 
         if (this.options.layout === TexturePacker.LAYOUT_COLNUM) {
-            this.options.colnum = this.options.colnum || 8;
+            this.options.colnum = this.options.colnum ?? 8;
         }
 
-        this.options.updateInputMeshes = this.options.updateInputMeshes || true;
-        this.options.disposeSources = this.options.disposeSources || true;
+        this.options.updateInputMeshes = this.options.updateInputMeshes ?? true;
+        this.options.disposeSources = this.options.disposeSources ?? true;
         this._expecting = 0;
 
-        this.options.fillBlanks = this.options.fillBlanks || true;
+        this.options.fillBlanks = this.options.fillBlanks ?? true;
 
         if (this.options.fillBlanks === true) {
-            this.options.customFillColor = this.options.customFillColor || 'black';
+            this.options.customFillColor = this.options.customFillColor ?? 'black';
         }
 
-        this.options.frameSize = this.options.frameSize || 256;
-        this.options.paddingRatio = this.options.paddingRatio || 0.0115;
+        this.options.frameSize = this.options.frameSize ?? 256;
+        this.options.paddingRatio = this.options.paddingRatio ?? 0.0115;
 
         this._paddingValue = Math.ceil(this.options.frameSize * this.options.paddingRatio);
 
@@ -215,10 +216,10 @@ export class TexturePacker{
             this._paddingValue++;
         }
 
-        this.options.paddingMode = this.options.paddingMode || TexturePacker.SUBUV_WRAP;
+        this.options.paddingMode = this.options.paddingMode ?? TexturePacker.SUBUV_WRAP;
 
         if (this.options.paddingMode === TexturePacker.SUBUV_COLOR) {
-            this.options.paddingColor = this.options.paddingColor || new Color4(0, 0, 0, 1.0);
+            this.options.paddingColor = this.options.paddingColor ?? new Color4(0, 0, 0, 1.0);
         }
 
         this.sets = {};
@@ -322,6 +323,7 @@ export class TexturePacker{
                     } else {
                         img.src = setTexture!.url;
                     }
+                    Tools.SetCorsBehavior(img.src, img);
 
                     img.onload = () => {
                         tcx.fillStyle = 'rgba(0,0,0,0)';

+ 2 - 2
src/Meshes/mesh.ts

@@ -1113,12 +1113,12 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
                 needToRecreate = true;
             } else {
                 for (var submesh of this.subMeshes) {
-                    if (submesh.indexStart + submesh.indexCount >= totalIndices) {
+                    if (submesh.indexStart + submesh.indexCount > totalIndices) {
                         needToRecreate = true;
                         break;
                     }
 
-                    if (submesh.verticesStart + submesh.verticesCount >= totalVertices) {
+                    if (submesh.verticesStart + submesh.verticesCount > totalVertices) {
                         needToRecreate = true;
                         break;
                     }

+ 11 - 11
src/Shaders/ShadersInclude/lightFragment.fx

@@ -57,7 +57,7 @@
             #ifdef HEMILIGHT{X}
                 info.diffuse = computeHemisphericDiffuseLighting(preInfo, light{X}.vLightDiffuse.rgb, light{X}.vLightGround);
             #elif defined(SS_TRANSLUCENCY)
-                info.diffuse = computeDiffuseAndTransmittedLighting(preInfo, light{X}.vLightDiffuse.rgb, transmittance);
+                info.diffuse = computeDiffuseAndTransmittedLighting(preInfo, light{X}.vLightDiffuse.rgb, subSurfaceOut.transmittance);
             #else
                 info.diffuse = computeDiffuseLighting(preInfo, light{X}.vLightDiffuse.rgb);
             #endif
@@ -65,9 +65,9 @@
             // Specular contribution
             #ifdef SPECULARTERM
                 #ifdef ANISOTROPIC
-                    info.specular = computeAnisotropicSpecularLighting(preInfo, viewDirectionW, normalW, anisotropicTangent, anisotropicBitangent, anisotropy, specularEnvironmentR0, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
+                    info.specular = computeAnisotropicSpecularLighting(preInfo, viewDirectionW, normalW, anisotropicOut.anisotropicTangent, anisotropicOut.anisotropicBitangent, anisotropicOut.anisotropy, clearcoatOut.specularEnvironmentR0, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
                 #else
-                    info.specular = computeSpecularLighting(preInfo, normalW, specularEnvironmentR0, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
+                    info.specular = computeSpecularLighting(preInfo, normalW, clearcoatOut.specularEnvironmentR0, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
                 #endif
             #endif
 
@@ -75,31 +75,31 @@
             #ifdef SHEEN
                 #ifdef SHEEN_LINKWITHALBEDO
                     // BE Carefull: Sheen intensity is replacing the roughness value.
-                    preInfo.roughness = sheenIntensity;
+                    preInfo.roughness = sheenOut.sheenIntensity;
                 #else
                     #ifdef HEMILIGHT{X}
-                        preInfo.roughness = sheenRoughness;
+                        preInfo.roughness = sheenOut.sheenRoughness;
                     #else
-                        preInfo.roughness = adjustRoughnessFromLightProperties(sheenRoughness, light{X}.vLightSpecular.a, preInfo.lightDistance);
+                        preInfo.roughness = adjustRoughnessFromLightProperties(sheenOut.sheenRoughness, light{X}.vLightSpecular.a, preInfo.lightDistance);
                     #endif
                 #endif
-                info.sheen = computeSheenLighting(preInfo, normalW, sheenColor, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
+                info.sheen = computeSheenLighting(preInfo, normalW, sheenOut.sheenColor, specularEnvironmentR90, AARoughnessFactors.x, light{X}.vLightDiffuse.rgb);
             #endif
 
             // Clear Coat contribution
             #ifdef CLEARCOAT
                 // Simulates Light radius
                 #ifdef HEMILIGHT{X}
-                    preInfo.roughness = clearCoatRoughness;
+                    preInfo.roughness = clearcoatOut.clearCoatRoughness;
                 #else
-                    preInfo.roughness = adjustRoughnessFromLightProperties(clearCoatRoughness, light{X}.vLightSpecular.a, preInfo.lightDistance);
+                    preInfo.roughness = adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness, light{X}.vLightSpecular.a, preInfo.lightDistance);
                 #endif
 
-                info.clearCoat = computeClearCoatLighting(preInfo, clearCoatNormalW, clearCoatAARoughnessFactors.x, clearCoatIntensity, light{X}.vLightDiffuse.rgb);
+                info.clearCoat = computeClearCoatLighting(preInfo, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatAARoughnessFactors.x, clearcoatOut.clearCoatIntensity, light{X}.vLightDiffuse.rgb);
                 
                 #ifdef CLEARCOAT_TINT
                     // Absorption
-                    absorption = computeClearCoatLightingAbsorption(clearCoatNdotVRefract, preInfo.L, clearCoatNormalW, clearCoatColor, clearCoatThickness, clearCoatIntensity);
+                    absorption = computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract, preInfo.L, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatColor, clearcoatOut.clearCoatThickness, clearcoatOut.clearCoatIntensity);
                     info.diffuse *= absorption;
                     #ifdef SPECULARTERM
                         info.specular *= absorption;

+ 73 - 0
src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx

@@ -0,0 +1,73 @@
+struct albedoOpacityOutParams
+{
+    vec3 surfaceAlbedo;
+    float alpha;
+};
+
+void albedoOpacityBlock(
+    const in vec4 vAlbedoColor,
+#ifdef ALBEDO
+    const in vec4 albedoTexture,
+    const in vec2 vAlbedoInfos,
+#endif
+#ifdef OPACITY
+    const in vec4 opacityMap,
+    const in vec2 vOpacityInfos,
+#endif
+    out albedoOpacityOutParams outParams
+)
+{
+    // _____________________________ Albedo Information ______________________________
+    vec3 surfaceAlbedo = vAlbedoColor.rgb;
+    float alpha = vAlbedoColor.a;
+
+    #ifdef ALBEDO
+        #if defined(ALPHAFROMALBEDO) || defined(ALPHATEST)
+            alpha *= albedoTexture.a;
+        #endif
+
+        #ifdef GAMMAALBEDO
+            surfaceAlbedo *= toLinearSpace(albedoTexture.rgb);
+        #else
+            surfaceAlbedo *= albedoTexture.rgb;
+        #endif
+
+        surfaceAlbedo *= vAlbedoInfos.y;
+    #endif
+
+    #ifdef VERTEXCOLOR
+        surfaceAlbedo *= vColor.rgb;
+    #endif
+
+    #define CUSTOM_FRAGMENT_UPDATE_ALBEDO
+
+    // _____________________________ Alpha Information _______________________________
+    #ifdef OPACITY
+        #ifdef OPACITYRGB
+            alpha = getLuminance(opacityMap.rgb);
+        #else
+            alpha *= opacityMap.a;
+        #endif
+
+        alpha *= vOpacityInfos.y;
+    #endif
+
+    #ifdef VERTEXALPHA
+        alpha *= vColor.a;
+    #endif
+
+    #if !defined(SS_LINKREFRACTIONTOTRANSPARENCY) && !defined(ALPHAFRESNEL)
+        #ifdef ALPHATEST
+            if (alpha < ALPHATESTVALUE)
+                discard;
+
+            #ifndef ALPHABLEND
+                // Prevent to blend with the canvas.
+                alpha = 1.0;
+            #endif
+        #endif
+    #endif
+
+    outParams.surfaceAlbedo = surfaceAlbedo;
+    outParams.alpha = alpha;
+}

+ 44 - 0
src/Shaders/ShadersInclude/pbrBlockAlphaFresnel.fx

@@ -0,0 +1,44 @@
+#ifdef ALPHAFRESNEL
+#if defined(ALPHATEST) || defined(ALPHABLEND)
+    struct alphaFresnelOutParams
+    {
+        float alpha;
+    };
+
+    void alphaFresnelBlock(
+        const in vec3 normalW,
+        const in vec3 viewDirectionW,
+        const in float alpha,
+        const in float microSurface,
+        out alphaFresnelOutParams outParams
+    )
+    {
+        // Convert approximate perceptual opacity (gamma-encoded opacity) to linear opacity (absorptance, or inverse transmission)
+        // for use with the linear HDR render target. The final composition will be converted back to gamma encoded values for eventual display.
+        // Uses power 2.0 rather than 2.2 for simplicity/efficiency, and because the mapping does not need to map the gamma applied to RGB.
+        float opacityPerceptual = alpha;
+
+        #ifdef LINEARALPHAFRESNEL
+            float opacity0 = opacityPerceptual;
+        #else
+            float opacity0 = opacityPerceptual * opacityPerceptual;
+        #endif
+        float opacity90 = fresnelGrazingReflectance(opacity0);
+
+        vec3 normalForward = faceforward(normalW, -viewDirectionW, normalW);
+
+        // Calculate the appropriate linear opacity for the current viewing angle (formally, this quantity is the "directional absorptance").
+        outParams.alpha = getReflectanceFromAnalyticalBRDFLookup_Jones(saturate(dot(viewDirectionW, normalForward)), vec3(opacity0), vec3(opacity90), sqrt(microSurface)).x;
+
+        #ifdef ALPHATEST
+            if (outParams.alpha < ALPHATESTVALUE)
+                discard;
+
+            #ifndef ALPHABLEND
+                // Prevent to blend with the canvas.
+                outParams.alpha = 1.0;
+            #endif
+        #endif
+    }
+#endif
+#endif

+ 32 - 0
src/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.fx

@@ -0,0 +1,32 @@
+struct ambientOcclusionOutParams
+{
+    vec3 ambientOcclusionColor;
+#if DEBUGMODE > 0
+    vec3 ambientOcclusionColorMap;
+#endif
+};
+
+void ambientOcclusionBlock(
+#ifdef AMBIENT
+    const in vec3 ambientOcclusionColorMap_,
+    const in vec4 vAmbientInfos,
+#endif
+    out ambientOcclusionOutParams outParams
+)
+{
+    vec3 ambientOcclusionColor = vec3(1., 1., 1.);
+
+    #ifdef AMBIENT
+        vec3 ambientOcclusionColorMap = ambientOcclusionColorMap_ * vAmbientInfos.y;
+        #ifdef AMBIENTINGRAYSCALE
+            ambientOcclusionColorMap = vec3(ambientOcclusionColorMap.r, ambientOcclusionColorMap.r, ambientOcclusionColorMap.r);
+        #endif
+        ambientOcclusionColor = mix(ambientOcclusionColor, ambientOcclusionColorMap, vAmbientInfos.z);
+    #endif
+
+    outParams.ambientOcclusionColor = ambientOcclusionColor;
+
+    #if DEBUGMODE > 0
+        outParams.ambientOcclusionColorMap = ambientOcclusionColorMap;
+    #endif
+}

+ 48 - 0
src/Shaders/ShadersInclude/pbrBlockAnisotropic.fx

@@ -0,0 +1,48 @@
+#ifdef ANISOTROPIC
+    struct anisotropicOutParams
+    {
+        float anisotropy;
+        vec3 anisotropicTangent;
+        vec3 anisotropicBitangent;
+        vec3 anisotropicNormal;
+    #if DEBUGMODE > 0
+        vec3 anisotropyMapData;
+    #endif
+    };
+
+    void anisotropicBlock(
+        const in vec3 vAnisotropy,
+    #ifdef ANISOTROPIC_TEXTURE
+        const in vec2 vAnisotropyInfos,
+        const in vec2 vAnisotropyUV,
+        const in vec2 uvOffset,
+        const in sampler2D anisotropySampler,
+    #endif
+        const in mat3 TBN,
+        const in vec3 normalW,
+        const in vec3 viewDirectionW,
+        out anisotropicOutParams outParams
+    )
+    {
+        float anisotropy = vAnisotropy.b;
+        vec3 anisotropyDirection = vec3(vAnisotropy.xy, 0.);
+
+        #ifdef ANISOTROPIC_TEXTURE
+            vec3 anisotropyMapData = texture2D(anisotropySampler, vAnisotropyUV + uvOffset).rgb * vAnisotropyInfos.y;
+            anisotropy *= anisotropyMapData.b;
+            anisotropyDirection.rg *= anisotropyMapData.rg * 2.0 - 1.0;
+            #if DEBUGMODE > 0
+                outParams.anisotropyMapData = anisotropyMapData;
+            #endif
+        #endif
+
+        mat3 anisoTBN = mat3(normalize(TBN[0]), normalize(TBN[1]), normalize(TBN[2]));
+        vec3 anisotropicTangent = normalize(anisoTBN * anisotropyDirection);
+        vec3 anisotropicBitangent = normalize(cross(anisoTBN[2], anisotropicTangent));
+        
+        outParams.anisotropy = anisotropy;
+        outParams.anisotropicTangent = anisotropicTangent;
+        outParams.anisotropicBitangent = anisotropicBitangent;
+        outParams.anisotropicNormal = getAnisotropicBentNormals(anisotropicTangent, anisotropicBitangent, normalW, viewDirectionW, anisotropy);
+    }
+#endif

+ 319 - 0
src/Shaders/ShadersInclude/pbrBlockClearcoat.fx

@@ -0,0 +1,319 @@
+struct clearcoatOutParams
+{
+    vec3 specularEnvironmentR0;
+    float conservationFactor;
+    vec3 clearCoatNormalW;
+    vec2 clearCoatAARoughnessFactors;
+    float clearCoatIntensity;
+    float clearCoatRoughness;
+#ifdef REFLECTION
+    vec3 finalClearCoatRadianceScaled;
+#endif
+#ifdef CLEARCOAT_TINT
+    vec3 absorption;
+    float clearCoatNdotVRefract;
+    vec3 clearCoatColor;
+    float clearCoatThickness;
+#endif
+#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
+    vec3 energyConservationFactorClearCoat;
+#endif
+#if DEBUGMODE > 0
+    mat3 TBNClearCoat;
+    vec2 clearCoatMapData;
+    vec4 clearCoatTintMapData;
+    vec4 environmentClearCoatRadiance;
+    float clearCoatNdotV;
+    vec3 clearCoatEnvironmentReflectance;
+#endif
+};
+
+#ifdef CLEARCOAT
+    void clearcoatBlock(
+        const in vec3 vPositionW,
+        const in vec3 geometricNormalW,
+        const in vec3 viewDirectionW,
+        const in vec2 vClearCoatParams,
+        const in vec2 uvOffset,
+        const in vec3 specularEnvironmentR0,
+    #ifdef CLEARCOAT_TEXTURE
+        const in vec2 vClearCoatUV,
+        const in vec2 vClearCoatInfos,
+        const in sampler2D clearCoatSampler,
+    #endif
+    #ifdef CLEARCOAT_TINT
+        const in vec4 vClearCoatTintParams,
+        const in float clearCoatColorAtDistance,
+        const in vec4 vClearCoatRefractionParams,
+        #ifdef CLEARCOAT_TINT_TEXTURE
+            const in vec2 vClearCoatTintUV_,
+            const in sampler2D clearCoatTintSampler,
+        #endif
+    #endif
+    #ifdef CLEARCOAT_BUMP
+        const in vec2 vClearCoatBumpInfos,
+        const in vec2 vClearCoatBumpUV_,
+        const in sampler2D clearCoatBumpSampler,
+        #if defined(TANGENT) && defined(NORMAL)
+            const in mat3 vTBN,
+        #else
+            const in vec2 vClearCoatTangentSpaceParams,
+        #endif
+        #ifdef OBJECTSPACE_NORMALMAP
+            const in mat4 normalMatrix,
+        #endif
+    #endif
+    #if defined(FORCENORMALFORWARD) && defined(NORMAL)
+        const in vec3 faceNormal,
+    #endif
+    #ifdef REFLECTION
+        const in vec3 vReflectionMicrosurfaceInfos,
+        const in vec4 vLightingIntensity,
+        #ifdef REFLECTIONMAP_3D
+            const in samplerCube reflectionSampler,
+        #else
+            const in sampler2D reflectionSampler,
+        #endif
+        #ifndef LODBASEDMICROSFURACE
+            const in sampler2D reflectionSamplerLow,
+            const in sampler2D reflectionSamplerHigh,
+        #endif
+    #endif
+    #if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
+        #ifdef RADIANCEOCCLUSION
+            const in float ambientMonochrome,
+        #endif
+    #endif
+        out clearcoatOutParams outParams
+    )
+    {
+        // Clear COAT parameters.
+        float clearCoatIntensity = vClearCoatParams.x;
+        float clearCoatRoughness = vClearCoatParams.y;
+
+        #ifdef CLEARCOAT_TEXTURE
+            vec2 clearCoatMapData = texture2D(clearCoatSampler, vClearCoatUV + uvOffset).rg * vClearCoatInfos.y;
+            clearCoatIntensity *= clearCoatMapData.x;
+            clearCoatRoughness *= clearCoatMapData.y;
+            #if DEBUGMODE > 0
+                outParams.clearCoatMapData = clearCoatMapData;
+            #endif
+        #endif
+
+        outParams.clearCoatIntensity = clearCoatIntensity;
+        outParams.clearCoatRoughness = clearCoatRoughness;
+
+        #ifdef CLEARCOAT_TINT
+            vec3 clearCoatColor = vClearCoatTintParams.rgb;
+            float clearCoatThickness = vClearCoatTintParams.a;
+
+            #ifdef CLEARCOAT_TINT_TEXTURE
+                vec4 clearCoatTintMapData = texture2D(clearCoatTintSampler, vClearCoatTintUV_ + uvOffset);
+                clearCoatColor *= toLinearSpace(clearCoatTintMapData.rgb);
+                clearCoatThickness *= clearCoatTintMapData.a;
+                #if DEBUGMODE > 0
+                    outParams.clearCoatTintMapData = clearCoatTintMapData;
+                #endif
+            #endif
+
+            outParams.clearCoatColor = computeColorAtDistanceInMedia(clearCoatColor, clearCoatColorAtDistance);
+            outParams.clearCoatThickness = clearCoatThickness;
+        #endif
+
+        // remapping and linearization of clear coat roughness
+        // Let s see how it ends up in gltf
+        // clearCoatRoughness = mix(0.089, 0.6, clearCoatRoughness);
+
+        // Remap F0 to account for the change of interface within the material.
+        vec3 specularEnvironmentR0Updated = getR0RemappedForClearCoat(specularEnvironmentR0);
+        outParams.specularEnvironmentR0 = mix(specularEnvironmentR0, specularEnvironmentR0Updated, clearCoatIntensity);
+
+        // Needs to use the geometric normal before bump for this.
+        vec3 clearCoatNormalW = geometricNormalW;
+
+        #ifdef CLEARCOAT_BUMP
+            #ifdef NORMALXYSCALE
+                float clearCoatNormalScale = 1.0;
+            #else
+                float clearCoatNormalScale = vClearCoatBumpInfos.y;
+            #endif
+
+            #if defined(TANGENT) && defined(NORMAL)
+                mat3 TBNClearCoat = vTBN;
+            #else
+                mat3 TBNClearCoat = cotangent_frame(clearCoatNormalW * clearCoatNormalScale, vPositionW, vClearCoatBumpUV, vClearCoatTangentSpaceParams);
+            #endif
+
+            #if DEBUGMODE > 0
+                outParams.TBNClearCoat = TBNClearCoat;
+            #endif
+
+            #ifdef OBJECTSPACE_NORMALMAP
+                clearCoatNormalW = normalize(texture2D(clearCoatBumpSampler, vClearCoatBumpUV + uvOffset).xyz  * 2.0 - 1.0);
+                clearCoatNormalW = normalize(mat3(normalMatrix) * clearCoatNormalW);
+            #else
+                clearCoatNormalW = perturbNormal(TBNClearCoat, texture2D(clearCoatBumpSampler, vClearCoatBumpUV + uvOffset).xyz, vClearCoatBumpInfos.y);
+            #endif
+        #endif
+
+        #if defined(FORCENORMALFORWARD) && defined(NORMAL)
+            clearCoatNormalW *= sign(dot(clearCoatNormalW, faceNormal));
+        #endif
+
+        #if defined(TWOSIDEDLIGHTING) && defined(NORMAL)
+            clearCoatNormalW = gl_FrontFacing ? clearCoatNormalW : -clearCoatNormalW;
+        #endif
+
+        outParams.clearCoatNormalW = clearCoatNormalW;
+
+        // Clear Coat AA
+        outParams.clearCoatAARoughnessFactors = getAARoughnessFactors(clearCoatNormalW.xyz);
+
+        // Compute N dot V.
+        float clearCoatNdotVUnclamped = dot(clearCoatNormalW, viewDirectionW);
+        // The order 1886 page 3.
+        float clearCoatNdotV = absEps(clearCoatNdotVUnclamped);
+
+        #if DEBUGMODE > 0
+            outParams.clearCoatNdotV = clearCoatNdotV;
+        #endif
+
+        #ifdef CLEARCOAT_TINT
+            // Used later on in the light fragment and ibl.
+            vec3 clearCoatVRefract = -refract(vPositionW, clearCoatNormalW, vClearCoatRefractionParams.y);
+            // The order 1886 page 3.
+            outParams.clearCoatNdotVRefract = absEps(dot(clearCoatNormalW, clearCoatVRefract));
+        #endif
+
+        #if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
+            // BRDF Lookup
+            vec3 environmentClearCoatBrdf = getBRDFLookup(clearCoatNdotV, clearCoatRoughness);
+        #endif
+
+        // Clear Coat Reflection
+        #if defined(REFLECTION)
+            float clearCoatAlphaG = convertRoughnessToAverageSlope(clearCoatRoughness);
+
+            #ifdef SPECULARAA
+                // Adapt linear roughness (alphaG) to geometric curvature of the current pixel.
+                clearCoatAlphaG += outParams.clearCoatAARoughnessFactors.y;
+            #endif
+
+            vec4 environmentClearCoatRadiance = vec4(0., 0., 0., 0.);
+
+            vec3 clearCoatReflectionVector = computeReflectionCoords(vec4(vPositionW, 1.0), clearCoatNormalW);
+            #ifdef REFLECTIONMAP_OPPOSITEZ
+                clearCoatReflectionVector.z *= -1.0;
+            #endif
+
+            // _____________________________ 2D vs 3D Maps ________________________________
+            #ifdef REFLECTIONMAP_3D
+                vec3 clearCoatReflectionCoords = clearCoatReflectionVector;
+            #else
+                vec2 clearCoatReflectionCoords = clearCoatReflectionVector.xy;
+                #ifdef REFLECTIONMAP_PROJECTION
+                    clearCoatReflectionCoords /= clearCoatReflectionVector.z;
+                #endif
+                clearCoatReflectionCoords.y = 1.0 - clearCoatReflectionCoords.y;
+            #endif
+
+            #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
+                float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG, clearCoatNdotVUnclamped);
+            #elif defined(LINEARSPECULARREFLECTION)
+                float clearCoatReflectionLOD = getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x, clearCoatRoughness);
+            #else
+                float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG);
+            #endif
+
+            #ifdef LODBASEDMICROSFURACE
+                // Apply environment convolution scale/offset filter tuning parameters to the mipmap LOD selection
+                clearCoatReflectionLOD = clearCoatReflectionLOD * vReflectionMicrosurfaceInfos.y + vReflectionMicrosurfaceInfos.z;
+                float requestedClearCoatReflectionLOD = clearCoatReflectionLOD;
+
+                environmentClearCoatRadiance = sampleReflectionLod(reflectionSampler, clearCoatReflectionCoords, requestedClearCoatReflectionLOD);
+            #else
+                float lodClearCoatReflectionNormalized = saturate(clearCoatReflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
+                float lodClearCoatReflectionNormalizedDoubled = lodClearCoatReflectionNormalized * 2.0;
+
+                vec4 environmentClearCoatMid = sampleReflection(reflectionSampler, clearCoatReflectionCoords);
+                if (lodClearCoatReflectionNormalizedDoubled < 1.0) {
+                    environmentClearCoatRadiance = mix(
+                        sampleReflection(reflectionSamplerHigh, clearCoatReflectionCoords),
+                        environmentClearCoatMid,
+                        lodClearCoatReflectionNormalizedDoubled
+                    );
+                } else {
+                    environmentClearCoatRadiance = mix(
+                        environmentClearCoatMid,
+                        sampleReflection(reflectionSamplerLow, clearCoatReflectionCoords),
+                        lodClearCoatReflectionNormalizedDoubled - 1.0
+                    );
+                }
+            #endif
+
+            #ifdef RGBDREFLECTION
+                environmentClearCoatRadiance.rgb = fromRGBD(environmentClearCoatRadiance);
+            #endif
+
+            #ifdef GAMMAREFLECTION
+                environmentClearCoatRadiance.rgb = toLinearSpace(environmentClearCoatRadiance.rgb);
+            #endif
+
+            // _____________________________ Levels _____________________________________
+            environmentClearCoatRadiance.rgb *= vReflectionInfos.x;
+            environmentClearCoatRadiance.rgb *= vReflectionColor.rgb;
+
+            #if DEBUGMODE > 0
+                outParams.environmentClearCoatRadiance = environmentClearCoatRadiance;
+            #endif
+
+            // _________________________ Clear Coat Environment Oclusion __________________________
+            #if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
+                vec3 clearCoatEnvironmentReflectance = getReflectanceFromBRDFLookup(vec3(vClearCoatRefractionParams.x), environmentClearCoatBrdf);
+
+                #ifdef RADIANCEOCCLUSION
+                    float clearCoatSeo = environmentRadianceOcclusion(ambientMonochrome, clearCoatNdotVUnclamped);
+                    clearCoatEnvironmentReflectance *= clearCoatSeo;
+                #endif
+
+                #ifdef HORIZONOCCLUSION
+                    #ifdef BUMP
+                        #ifdef REFLECTIONMAP_3D
+                            float clearCoatEho = environmentHorizonOcclusion(-viewDirectionW, clearCoatNormalW, geometricNormalW);
+                            clearCoatEnvironmentReflectance *= clearCoatEho;
+                        #endif
+                    #endif
+                #endif
+            #else
+                // Jones implementation of a well balanced fast analytical solution.
+                vec3 clearCoatEnvironmentReflectance = getReflectanceFromAnalyticalBRDFLookup_Jones(clearCoatNdotV, vec3(1.), vec3(1.), sqrt(1. - clearCoatRoughness));
+            #endif
+
+            clearCoatEnvironmentReflectance *= clearCoatIntensity;
+
+            #if DEBUGMODE > 0
+                outParams.clearCoatEnvironmentReflectance = clearCoatEnvironmentReflectance;
+            #endif
+
+            outParams.finalClearCoatRadianceScaled = 
+                environmentClearCoatRadiance.rgb *
+                clearCoatEnvironmentReflectance *
+                vLightingIntensity.z;
+        #endif
+
+        #if defined(CLEARCOAT_TINT)
+            // NdotL = NdotV in IBL
+            outParams.absorption = computeClearCoatAbsorption(outParams.clearCoatNdotVRefract, outParams.clearCoatNdotVRefract, outParams.clearCoatColor, clearCoatThickness, clearCoatIntensity);
+        #endif
+
+        // clear coat energy conservation
+        float fresnelIBLClearCoat = fresnelSchlickGGX(clearCoatNdotV, vClearCoatRefractionParams.x, CLEARCOATREFLECTANCE90);
+        fresnelIBLClearCoat *= clearCoatIntensity;
+
+        outParams.conservationFactor = (1. - fresnelIBLClearCoat);
+
+        #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
+            outParams.energyConservationFactorClearCoat = getEnergyConservationFactor(outParams.specularEnvironmentR0, environmentClearCoatBrdf);
+        #endif
+    }
+#endif

+ 32 - 0
src/Shaders/ShadersInclude/pbrBlockDirectLighting.fx

@@ -0,0 +1,32 @@
+vec3 diffuseBase = vec3(0., 0., 0.);
+#ifdef SPECULARTERM
+    vec3 specularBase = vec3(0., 0., 0.);
+#endif
+#ifdef CLEARCOAT
+    vec3 clearCoatBase = vec3(0., 0., 0.);
+#endif
+#ifdef SHEEN
+    vec3 sheenBase = vec3(0., 0., 0.);
+#endif
+
+#ifdef LIGHTMAP
+    vec4 lightmapColor = texture2D(lightmapSampler, vLightmapUV + uvOffset);
+
+    #ifdef RGBDLIGHTMAP
+        lightmapColor.rgb = fromRGBD(lightmapColor);
+    #endif
+
+    #ifdef GAMMALIGHTMAP
+        lightmapColor.rgb = toLinearSpace(lightmapColor.rgb);
+    #endif
+    lightmapColor.rgb *= vLightmapInfos.y;
+#endif
+
+// Direct Lighting Variables
+preLightingInfo preInfo;
+lightingInfo info;
+float shadow = 1.; // 1 - shadowLevel
+
+#if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)
+    vec3 absorption = vec3(0.);
+#endif

+ 47 - 0
src/Shaders/ShadersInclude/pbrBlockFinalColorComposition.fx

@@ -0,0 +1,47 @@
+vec4 finalColor = vec4(
+        finalAmbient +
+        finalDiffuse +
+#ifndef UNLIT
+    #ifdef REFLECTION
+        finalIrradiance +
+    #endif
+    #ifdef SPECULARTERM
+        finalSpecularScaled +
+    #endif
+    #ifdef SHEEN
+        finalSheenScaled +
+    #endif
+    #ifdef CLEARCOAT
+        finalClearCoatScaled +
+    #endif
+    #ifdef REFLECTION
+        finalRadianceScaled +
+        #if defined(SHEEN) && defined(ENVIRONMENTBRDF)
+            sheenOut.finalSheenRadianceScaled +
+        #endif
+        #ifdef CLEARCOAT
+            clearcoatOut.finalClearCoatRadianceScaled +
+        #endif
+    #endif
+    #ifdef SS_REFRACTION
+        subSurfaceOut.finalRefraction +
+    #endif
+#endif
+        finalEmissive,
+        alpha);
+
+// _____________________________ LightMappping _____________________________________
+#ifdef LIGHTMAP
+    #ifndef LIGHTMAPEXCLUDED
+        #ifdef USELIGHTMAPASSHADOWMAP
+            finalColor.rgb *= lightmapColor.rgb;
+        #else
+            finalColor.rgb += lightmapColor.rgb;
+        #endif
+    #endif
+#endif
+
+#define CUSTOM_FRAGMENT_BEFORE_FOG
+
+// _____________________________ Finally ___________________________________________
+finalColor = max(finalColor, 0.0);

+ 133 - 0
src/Shaders/ShadersInclude/pbrBlockFinalLitComponents.fx

@@ -0,0 +1,133 @@
+// ______________________________________________________________________________
+// _____________________________ Energy Conservation  ___________________________
+// Apply Energy Conservation.
+// _____________________________ IBL BRDF + Energy Cons ________________________________
+#if defined(ENVIRONMENTBRDF)
+    #ifdef MS_BRDF_ENERGY_CONSERVATION
+        vec3 energyConservationFactor = getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0, environmentBrdf);
+    #endif
+#endif
+
+#ifndef METALLICWORKFLOW
+    #ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION
+        surfaceAlbedo.rgb = (1. - reflectance) * surfaceAlbedo.rgb;
+    #endif
+#endif
+
+#if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)
+    surfaceAlbedo.rgb = sheenOut.sheenAlbedoScaling * surfaceAlbedo.rgb;
+#endif
+
+// _____________________________ Irradiance ______________________________________
+#ifdef REFLECTION
+    vec3 finalIrradiance = reflectionOut.environmentIrradiance;
+
+    #if defined(CLEARCOAT)
+        finalIrradiance *= clearcoatOut.conservationFactor;
+        #if defined(CLEARCOAT_TINT)
+            finalIrradiance *= clearcoatOut.absorption;
+        #endif
+    #endif
+
+    #if defined(SS_REFRACTION)
+        finalIrradiance *= subSurfaceOut.refractionFactorForIrradiance;
+    #endif
+
+    #if defined(SS_TRANSLUCENCY)
+        finalIrradiance += subSurfaceOut.refractionIrradiance;
+    #endif
+
+    finalIrradiance *= surfaceAlbedo.rgb;
+    finalIrradiance *= vLightingIntensity.z;
+#endif
+
+// _____________________________ Specular ________________________________________
+#ifdef SPECULARTERM
+    vec3 finalSpecular = specularBase;
+    finalSpecular = max(finalSpecular, 0.0);
+
+    vec3 finalSpecularScaled = finalSpecular * vLightingIntensity.x * vLightingIntensity.w;
+
+    #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
+        finalSpecularScaled *= energyConservationFactor;
+    #endif
+
+    #if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
+        finalSpecularScaled *= sheenOut.sheenAlbedoScaling;
+    #endif
+#endif
+
+// _____________________________ Radiance ________________________________________
+#ifdef REFLECTION
+    vec3 finalRadiance = reflectionOut.environmentRadiance.rgb;
+    finalRadiance *= subSurfaceOut.specularEnvironmentReflectance;
+
+    vec3 finalRadianceScaled = finalRadiance * vLightingIntensity.z;
+
+    #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
+        finalRadianceScaled *= energyConservationFactor;
+    #endif
+
+    #if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
+        finalRadianceScaled *= sheenOut.sheenAlbedoScaling;
+    #endif
+#endif
+
+// ________________________________ Sheen ________________________________________
+#ifdef SHEEN
+    vec3 finalSheen = sheenBase * sheenOut.sheenColor;
+    finalSheen = max(finalSheen, 0.0);
+
+    vec3 finalSheenScaled = finalSheen * vLightingIntensity.x * vLightingIntensity.w;
+    
+    #if defined(CLEARCOAT) && defined(REFLECTION) && defined(ENVIRONMENTBRDF)
+        sheenOut.finalSheenRadianceScaled *= clearcoatOut.conservationFactor;
+
+        #if defined(CLEARCOAT_TINT)
+            sheenOut.finalSheenRadianceScaled *= clearcoatOut.absorption;
+        #endif
+    #endif
+#endif
+
+// _____________________________ Clear Coat _______________________________________
+#ifdef CLEARCOAT
+    vec3 finalClearCoat = clearCoatBase;
+    finalClearCoat = max(finalClearCoat, 0.0);
+
+    vec3 finalClearCoatScaled = finalClearCoat * vLightingIntensity.x * vLightingIntensity.w;
+
+    #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
+        finalClearCoatScaled *= clearcoatOut.energyConservationFactorClearCoat;
+    #endif
+
+    #ifdef SS_REFRACTION
+        subSurfaceOut.finalRefraction *= clearcoatOut.conservationFactor;
+
+        #ifdef CLEARCOAT_TINT
+            subSurfaceOut.finalRefraction *= clearcoatOut.absorption;
+        #endif
+    #endif
+#endif
+
+// _____________________________ Highlights on Alpha _____________________________
+#ifdef ALPHABLEND
+    float luminanceOverAlpha = 0.0;
+    #if	defined(REFLECTION) && defined(RADIANCEOVERALPHA)
+        luminanceOverAlpha += getLuminance(finalRadianceScaled);
+        #if defined(CLEARCOAT)
+            luminanceOverAlpha += getLuminance(clearcoatOut.finalClearCoatRadianceScaled);
+        #endif
+    #endif
+
+    #if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)
+        luminanceOverAlpha += getLuminance(finalSpecularScaled);
+    #endif
+
+    #if defined(CLEARCOAT) && defined(CLEARCOATOVERALPHA)
+        luminanceOverAlpha += getLuminance(finalClearCoatScaled);
+    #endif
+
+    #if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA)
+        alpha = saturate(alpha + luminanceOverAlpha * luminanceOverAlpha);
+    #endif
+#endif

+ 32 - 0
src/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.fx

@@ -0,0 +1,32 @@
+// _____________________________ Diffuse ________________________________________
+vec3 finalDiffuse = diffuseBase;
+finalDiffuse *= surfaceAlbedo.rgb;
+finalDiffuse = max(finalDiffuse, 0.0);
+finalDiffuse *= vLightingIntensity.x;
+
+// _____________________________ Ambient ________________________________________
+vec3 finalAmbient = vAmbientColor;
+finalAmbient *= surfaceAlbedo.rgb;
+
+// _____________________________ Emissive ________________________________________
+vec3 finalEmissive = vEmissiveColor;
+#ifdef EMISSIVE
+vec3 emissiveColorTex = texture2D(emissiveSampler, vEmissiveUV + uvOffset).rgb;
+finalEmissive *= toLinearSpace(emissiveColorTex.rgb);
+finalEmissive *=  vEmissiveInfos.y;
+#endif
+finalEmissive *= vLightingIntensity.y;
+
+// ______________________________ Ambient ________________________________________
+#ifdef AMBIENT
+vec3 ambientOcclusionForDirectDiffuse = mix(vec3(1.), aoOut.ambientOcclusionColor, vAmbientInfos.w);
+#else
+vec3 ambientOcclusionForDirectDiffuse = aoOut.ambientOcclusionColor;
+#endif
+
+finalAmbient *= aoOut.ambientOcclusionColor;
+finalDiffuse *= ambientOcclusionForDirectDiffuse;
+
+#if !defined(UNLIT) && defined(REFLECTION)
+finalIrradiance *= aoOut.ambientOcclusionColor;
+#endif

+ 35 - 0
src/Shaders/ShadersInclude/pbrBlockGeometryInfo.fx

@@ -0,0 +1,35 @@
+float NdotVUnclamped = dot(normalW, viewDirectionW);
+// The order 1886 page 3.
+float NdotV = absEps(NdotVUnclamped);
+float alphaG = convertRoughnessToAverageSlope(roughness);
+vec2 AARoughnessFactors = getAARoughnessFactors(normalW.xyz);
+
+#ifdef SPECULARAA
+    // Adapt linear roughness (alphaG) to geometric curvature of the current pixel.
+    alphaG += AARoughnessFactors.y;
+#endif
+
+#if defined(ENVIRONMENTBRDF)
+    // BRDF Lookup
+    vec3 environmentBrdf = getBRDFLookup(NdotV, roughness);
+#endif
+
+#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
+    #ifdef RADIANCEOCCLUSION
+        #ifdef AMBIENTINGRAYSCALE
+            float ambientMonochrome = aoOut.ambientOcclusionColor.r;
+        #else
+            float ambientMonochrome = getLuminance(aoOut.ambientOcclusionColor);
+        #endif
+
+        float seo = environmentRadianceOcclusion(ambientMonochrome, NdotVUnclamped);
+    #endif
+
+    #ifdef HORIZONOCCLUSION
+        #ifdef BUMP
+            #ifdef REFLECTIONMAP_3D
+                float eho = environmentHorizonOcclusion(-viewDirectionW, normalW, geometricNormalW);
+            #endif
+        #endif
+    #endif
+#endif

+ 15 - 0
src/Shaders/ShadersInclude/pbrBlockImageProcessing.fx

@@ -0,0 +1,15 @@
+#ifdef IMAGEPROCESSINGPOSTPROCESS
+    // Sanitize output incase invalid normals or tangents have caused div by 0 or undefined behavior
+    // this also limits the brightness which helpfully reduces over-sparkling in bloom (native handles this in the bloom blur shader)
+    finalColor.rgb = clamp(finalColor.rgb, 0., 30.0);
+#else
+    // Alway run to ensure we are going back to gamma space.
+    finalColor = applyImageProcessing(finalColor);
+#endif
+
+    finalColor.a *= visibility;
+
+#ifdef PREMULTIPLYALPHA
+    // Convert to associative (premultiplied) format if needed.
+    finalColor.rgb *= finalColor.a;
+#endif

+ 12 - 0
src/Shaders/ShadersInclude/pbrBlockNormalFinal.fx

@@ -0,0 +1,12 @@
+#if defined(FORCENORMALFORWARD) && defined(NORMAL)
+    vec3 faceNormal = normalize(cross(dFdx(vPositionW), dFdy(vPositionW))) * vEyePosition.w;
+    #if defined(TWOSIDEDLIGHTING)
+        faceNormal = gl_FrontFacing ? faceNormal : -faceNormal;
+    #endif
+
+    normalW *= sign(dot(normalW, faceNormal));
+#endif
+
+#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)
+    normalW = gl_FrontFacing ? normalW : -normalW;
+#endif

+ 13 - 0
src/Shaders/ShadersInclude/pbrBlockNormalGeometric.fx

@@ -0,0 +1,13 @@
+vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
+
+#ifdef NORMAL
+    vec3 normalW = normalize(vNormalW);
+#else
+    vec3 normalW = normalize(cross(dFdx(vPositionW), dFdy(vPositionW))) * vEyePosition.w;
+#endif
+
+vec3 geometricNormalW = normalW;
+
+#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)
+    geometricNormalW = gl_FrontFacing ? geometricNormalW : -geometricNormalW;
+#endif

+ 26 - 0
src/Shaders/ShadersInclude/pbrBlockReflectance.fx

@@ -0,0 +1,26 @@
+#if defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
+    vec3 specularEnvironmentReflectance = getReflectanceFromBRDFLookup(clearcoatOut.specularEnvironmentR0, environmentBrdf);
+
+    #ifdef RADIANCEOCCLUSION
+        specularEnvironmentReflectance *= seo;
+    #endif
+
+    #ifdef HORIZONOCCLUSION
+        #ifdef BUMP
+            #ifdef REFLECTIONMAP_3D
+                specularEnvironmentReflectance *= eho;
+            #endif
+        #endif
+    #endif
+#else
+    // Jones implementation of a well balanced fast analytical solution.
+    vec3 specularEnvironmentReflectance = getReflectanceFromAnalyticalBRDFLookup_Jones(NdotV, clearcoatOut.specularEnvironmentR0, specularEnvironmentR90, sqrt(microSurface));
+#endif
+
+#ifdef CLEARCOAT
+    specularEnvironmentReflectance *= clearcoatOut.conservationFactor;
+
+    #if defined(CLEARCOAT_TINT)
+        specularEnvironmentReflectance *= clearcoatOut.absorption;
+    #endif
+#endif

+ 4 - 0
src/Shaders/ShadersInclude/pbrBlockReflectance0.fx

@@ -0,0 +1,4 @@
+float reflectance = max(max(reflectivityOut.surfaceReflectivityColor.r, reflectivityOut.surfaceReflectivityColor.g), reflectivityOut.surfaceReflectivityColor.b);
+float reflectance90 = fresnelGrazingReflectance(reflectance);
+vec3 specularEnvironmentR0 = reflectivityOut.surfaceReflectivityColor.rgb;
+vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90;

+ 182 - 0
src/Shaders/ShadersInclude/pbrBlockReflection.fx

@@ -0,0 +1,182 @@
+#ifdef REFLECTION
+    struct reflectionOutParams
+    {
+        vec4 environmentRadiance;
+        vec3 environmentIrradiance;
+    #ifdef REFLECTIONMAP_3D
+        vec3 reflectionCoords;
+    #else
+        vec2 reflectionCoords;
+    #endif
+    #ifdef SS_TRANSLUCENCY
+        #ifdef USESPHERICALFROMREFLECTIONMAP
+            #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
+                vec3 irradianceVector;
+            #endif
+        #endif
+    #endif
+    };
+
+    void reflectionBlock(
+        const in vec3 vPositionW,
+        const in vec3 normalW,
+        const in float alphaG,
+        const in vec3 vReflectionMicrosurfaceInfos,
+        const in vec2 vReflectionInfos,
+    #ifdef ANISOTROPIC
+        const in anisotropicOutParams anisotropicOut,
+    #endif
+    #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
+        const in float NdotVUnclamped,
+    #endif
+    #ifdef LINEARSPECULARREFLECTION
+        const in float roughness,
+    #endif
+    #ifdef REFLECTIONMAP_3D
+        const in samplerCube reflectionSampler,
+    #else
+        const in sampler2D reflectionSampler,
+    #endif
+    #if defined(NORMAL) && defined(USESPHERICALINVERTEX)
+        const in vec3 vEnvironmentIrradiance,
+    #endif
+    #ifdef USESPHERICALFROMREFLECTIONMAP
+        #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
+            const in mat4 reflectionMatrix,
+        #endif
+    #endif
+    #ifdef USEIRRADIANCEMAP
+        #ifdef REFLECTIONMAP_3D
+            const in samplerCube irradianceSampler,
+        #else
+            const in sampler2D irradianceSampler,
+        #endif
+    #endif
+        out reflectionOutParams outParams
+    )
+    {
+        vec4 environmentRadiance = vec4(0., 0., 0., 0.);
+        vec3 environmentIrradiance = vec3(0., 0., 0.);
+
+        #ifdef ANISOTROPIC
+            vec3 reflectionVector = computeReflectionCoords(vec4(vPositionW, 1.0), anisotropicOut.anisotropicNormal);
+        #else
+            vec3 reflectionVector = computeReflectionCoords(vec4(vPositionW, 1.0), normalW);
+        #endif
+
+        #ifdef REFLECTIONMAP_OPPOSITEZ
+            reflectionVector.z *= -1.0;
+        #endif
+
+        // _____________________________ 2D vs 3D Maps ________________________________
+        #ifdef REFLECTIONMAP_3D
+            vec3 reflectionCoords = reflectionVector;
+        #else
+            vec2 reflectionCoords = reflectionVector.xy;
+            #ifdef REFLECTIONMAP_PROJECTION
+                reflectionCoords /= reflectionVector.z;
+            #endif
+            reflectionCoords.y = 1.0 - reflectionCoords.y;
+        #endif
+
+        #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
+            float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
+        #elif defined(LINEARSPECULARREFLECTION)
+            float reflectionLOD = getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x, roughness);
+        #else
+            float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG);
+        #endif
+
+        #ifdef LODBASEDMICROSFURACE
+            // Apply environment convolution scale/offset filter tuning parameters to the mipmap LOD selection
+            reflectionLOD = reflectionLOD * vReflectionMicrosurfaceInfos.y + vReflectionMicrosurfaceInfos.z;
+
+            #ifdef LODINREFLECTIONALPHA
+                // Automatic LOD adjustment to ensure that the smoothness-based environment LOD selection
+                // is constrained to appropriate LOD levels in order to prevent aliasing.
+                // The environment map is first sampled without custom LOD selection to determine
+                // the hardware-selected LOD, and this is then used to constrain the final LOD selection
+                // so that excessive surface smoothness does not cause aliasing (e.g. on curved geometry
+                // where the normal is varying rapidly).
+
+                // Note: Shader Model 4.1 or higher can provide this directly via CalculateLevelOfDetail(), and
+                // manual calculation via derivatives is also possible, but for simplicity we use the
+                // hardware LOD calculation with the alpha channel containing the LOD for each mipmap.
+                float automaticReflectionLOD = UNPACK_LOD(sampleReflection(reflectionSampler, reflectionCoords).a);
+                float requestedReflectionLOD = max(automaticReflectionLOD, reflectionLOD);
+            #else
+                float requestedReflectionLOD = reflectionLOD;
+            #endif
+
+            environmentRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, requestedReflectionLOD);
+        #else
+            float lodReflectionNormalized = saturate(reflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
+            float lodReflectionNormalizedDoubled = lodReflectionNormalized * 2.0;
+
+            vec4 environmentSpecularMid = sampleReflection(reflectionSampler, reflectionCoords);
+            if(lodReflectionNormalizedDoubled < 1.0){
+                environmentRadiance = mix(
+                    sampleReflection(reflectionSamplerHigh, reflectionCoords),
+                    environmentSpecularMid,
+                    lodReflectionNormalizedDoubled
+                );
+            }else{
+                environmentRadiance = mix(
+                    environmentSpecularMid,
+                    sampleReflection(reflectionSamplerLow, reflectionCoords),
+                    lodReflectionNormalizedDoubled - 1.0
+                );
+            }
+        #endif
+
+        #ifdef RGBDREFLECTION
+            environmentRadiance.rgb = fromRGBD(environmentRadiance);
+        #endif
+
+        #ifdef GAMMAREFLECTION
+            environmentRadiance.rgb = toLinearSpace(environmentRadiance.rgb);
+        #endif
+
+        // _____________________________ Irradiance ________________________________
+        #ifdef USESPHERICALFROMREFLECTIONMAP
+            #if defined(NORMAL) && defined(USESPHERICALINVERTEX)
+                environmentIrradiance = vEnvironmentIrradiance;
+            #else
+                #ifdef ANISOTROPIC
+                    vec3 irradianceVector = vec3(reflectionMatrix * vec4(anisotropicOut.anisotropicNormal, 0)).xyz;
+                #else
+                    vec3 irradianceVector = vec3(reflectionMatrix * vec4(normalW, 0)).xyz;
+                #endif
+
+                #ifdef REFLECTIONMAP_OPPOSITEZ
+                    irradianceVector.z *= -1.0;
+                #endif
+
+                environmentIrradiance = computeEnvironmentIrradiance(irradianceVector);
+
+                #ifdef SS_TRANSLUCENCY
+                    outParams.irradianceVector = irradianceVector;
+                #endif
+            #endif
+        #elif defined(USEIRRADIANCEMAP)
+            vec4 environmentIrradiance4 = sampleReflection(irradianceSampler, reflectionCoords);
+            environmentIrradiance = environmentIrradiance4.rgb;
+            #ifdef RGBDREFLECTION
+                environmentIrradiance.rgb = fromRGBD(environmentIrradiance4);
+            #endif
+
+            #ifdef GAMMAREFLECTION
+                environmentIrradiance.rgb = toLinearSpace(environmentIrradiance.rgb);
+            #endif
+        #endif
+
+        // _____________________________ Levels _____________________________________
+        environmentRadiance.rgb *= vReflectionInfos.x;
+        environmentRadiance.rgb *= vReflectionColor.rgb;
+        environmentIrradiance *= vReflectionColor.rgb;
+
+        outParams.environmentRadiance = environmentRadiance;
+        outParams.environmentIrradiance = environmentIrradiance;
+        outParams.reflectionCoords = reflectionCoords;
+    }
+#endif

+ 161 - 0
src/Shaders/ShadersInclude/pbrBlockReflectivity.fx

@@ -0,0 +1,161 @@
+struct reflectivityOutParams
+{
+    float microSurface;
+    float roughness;
+    vec3 surfaceReflectivityColor;
+#ifdef METALLICWORKFLOW
+    vec3 surfaceAlbedo;
+#endif
+#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY)  && defined(AOSTOREINMETALMAPRED)
+    vec3 ambientOcclusionColor;
+#endif
+#if DEBUGMODE > 0
+    vec4 surfaceMetallicColorMap;
+    vec4 surfaceReflectivityColorMap;
+    vec2 metallicRoughness;
+    vec3 metallicF0;
+#endif
+};
+
+void reflectivityBlock(
+    const in vec4 vReflectivityColor,
+    const in vec2 uvOffset,
+#ifdef METALLICWORKFLOW
+    const in vec3 surfaceAlbedo,
+#endif
+#ifdef REFLECTIVITY
+    const in vec3 vReflectivityInfos,
+    const in vec2 vReflectivityUV,
+    const in sampler2D reflectivitySampler,
+#endif
+#if defined(METALLICWORKFLOW) && defined(REFLECTIVITY)  && defined(AOSTOREINMETALMAPRED)
+    const in vec3 ambientOcclusionColor,
+#endif
+#ifdef MICROSURFACEMAP
+    const in vec2 vMicroSurfaceSamplerUV_,
+    const in vec2 vMicroSurfaceSamplerInfos,
+    const in sampler2D microSurfaceSampler,
+#endif
+    out reflectivityOutParams outParams
+)
+{
+    float microSurface = vReflectivityColor.a;
+    vec3 surfaceReflectivityColor = vReflectivityColor.rgb;
+
+    #ifdef METALLICWORKFLOW
+        vec2 metallicRoughness = surfaceReflectivityColor.rg;
+
+        #ifdef REFLECTIVITY
+            vec4 surfaceMetallicColorMap = texture2D(reflectivitySampler, vReflectivityUV + uvOffset);
+
+            #if DEBUGMODE > 0
+                outParams.surfaceMetallicColorMap = surfaceMetallicColorMap;
+            #endif
+
+            #ifdef AOSTOREINMETALMAPRED
+                vec3 aoStoreInMetalMap = vec3(surfaceMetallicColorMap.r, surfaceMetallicColorMap.r, surfaceMetallicColorMap.r);
+                outParams.ambientOcclusionColor = mix(ambientOcclusionColor, aoStoreInMetalMap, vReflectivityInfos.z);
+            #endif
+
+            #ifdef METALLNESSSTOREINMETALMAPBLUE
+                metallicRoughness.r *= surfaceMetallicColorMap.b;
+            #else
+                metallicRoughness.r *= surfaceMetallicColorMap.r;
+            #endif
+
+            #ifdef ROUGHNESSSTOREINMETALMAPALPHA
+                metallicRoughness.g *= surfaceMetallicColorMap.a;
+            #else
+                #ifdef ROUGHNESSSTOREINMETALMAPGREEN
+                    metallicRoughness.g *= surfaceMetallicColorMap.g;
+                #endif
+            #endif
+        #endif
+
+        #ifdef MICROSURFACEMAP
+            vec4 microSurfaceTexel = texture2D(microSurfaceSampler, vMicroSurfaceSamplerUV_ + uvOffset) * vMicroSurfaceSamplerInfos.y;
+            metallicRoughness.g *= microSurfaceTexel.r;
+        #endif
+
+        #if DEBUGMODE > 0
+            outParams.metallicRoughness = metallicRoughness;
+        #endif
+
+        #define CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS
+        
+        // Compute microsurface from roughness.
+        microSurface = 1.0 - metallicRoughness.g;
+
+        // Diffuse is used as the base of the reflectivity.
+        vec3 baseColor = surfaceAlbedo;
+
+        #ifdef REFLECTANCE
+            // *** NOT USED ANYMORE ***
+            // Following Frostbite Remapping,
+            // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf page 115
+            // vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic;
+            // where 0.16 * reflectance * reflectance remaps the reflectance to allow storage in 8 bit texture
+
+            // Compute the converted diffuse.
+            outParams.surfaceAlbedo = baseColor.rgb * (1.0 - metallicRoughness.r);
+
+            // Compute the converted reflectivity.
+            surfaceReflectivityColor = mix(0.16 * reflectance * reflectance, baseColor, metallicRoughness.r);
+        #else
+            vec3 metallicF0 = vec3(vReflectivityColor.a, vReflectivityColor.a, vReflectivityColor.a);
+            #ifdef METALLICF0FACTORFROMMETALLICMAP
+                #ifdef REFLECTIVITY
+                    metallicF0 *= surfaceMetallicColorMap.a;
+                #endif
+            #endif
+
+            #if DEBUGMODE > 0
+                outParams.metallicF0 = metallicF0;
+            #endif
+
+            // Compute the converted diffuse.
+            outParams.surfaceAlbedo = mix(baseColor.rgb * (1.0 - metallicF0.r), vec3(0., 0., 0.), metallicRoughness.r);
+
+            // Compute the converted reflectivity.
+            surfaceReflectivityColor = mix(metallicF0, baseColor, metallicRoughness.r);
+        #endif
+    #else
+        #ifdef REFLECTIVITY
+            vec4 surfaceReflectivityColorMap = texture2D(reflectivitySampler, vReflectivityUV + uvOffset);
+            surfaceReflectivityColor *= toLinearSpace(surfaceReflectivityColorMap.rgb);
+            surfaceReflectivityColor *= vReflectivityInfos.y;
+
+            #if DEBUGMODE > 0
+                outParams.surfaceReflectivityColorMap = surfaceReflectivityColorMap;
+                vec2 metallicRoughness;
+                vec3 metallicF0;
+            #endif
+
+            #ifdef MICROSURFACEFROMREFLECTIVITYMAP
+                microSurface *= surfaceReflectivityColorMap.a;
+                microSurface *= vReflectivityInfos.z;
+            #else
+                #ifdef MICROSURFACEAUTOMATIC
+                    microSurface *= computeDefaultMicroSurface(microSurface, surfaceReflectivityColor);
+                #endif
+
+                #ifdef MICROSURFACEMAP
+                    vec4 microSurfaceTexel = texture2D(microSurfaceSampler, vMicroSurfaceSamplerUV_ + uvOffset) * vMicroSurfaceSamplerInfos.y;
+                    microSurface *= microSurfaceTexel.r;
+                #endif
+                
+                #define CUSTOM_FRAGMENT_UPDATE_MICROSURFACE
+                
+            #endif
+        #endif
+    #endif
+
+	// Adapt microSurface.
+    microSurface = saturate(microSurface);
+    // Compute roughness.
+    float roughness = 1. - microSurface;
+
+    outParams.microSurface = microSurface;
+    outParams.roughness = roughness;
+    outParams.surfaceReflectivityColor = surfaceReflectivityColor;
+}

+ 212 - 0
src/Shaders/ShadersInclude/pbrBlockSheen.fx

@@ -0,0 +1,212 @@
+#ifdef SHEEN
+    struct sheenOutParams
+    {
+        float sheenIntensity;
+        vec3 sheenColor;
+        float sheenRoughness;
+    #ifdef SHEEN_LINKWITHALBEDO
+        vec3 surfaceAlbedo;
+    #endif
+    #if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
+        float sheenAlbedoScaling;
+    #endif
+    #if defined(REFLECTION) && defined(ENVIRONMENTBRDF)
+        vec3 finalSheenRadianceScaled;
+    #endif
+    #if DEBUGMODE > 0
+        vec4 sheenMapData;
+        vec3 sheenEnvironmentReflectance;
+    #endif
+    };
+
+    void sheenBlock(
+        const in vec4 vSheenColor,
+    #ifdef SHEEN_ROUGHNESS
+        const in float vSheenRoughness,
+    #endif
+        const in float roughness,
+    #ifdef SHEEN_TEXTURE
+        const in vec2 vSheenUV,
+        const in vec2 vSheenInfos,
+        const in vec2 uvOffset,
+        const in sampler2D sheenSampler,
+    #endif
+        const in float reflectance,
+    #ifdef SHEEN_LINKWITHALBEDO
+        const in vec3 baseColor,
+        const in vec3 surfaceAlbedo,
+    #endif
+    #ifdef ENVIRONMENTBRDF
+        const in float NdotV,
+    #endif
+    #if defined(REFLECTION) && defined(ENVIRONMENTBRDF)
+        const in vec2 AARoughnessFactors,
+        const in vec3 vReflectionMicrosurfaceInfos,
+        const in vec2 vReflectionInfos,
+        const in vec3 vReflectionColor,
+        const in vec4 vLightingIntensity,
+        #ifdef REFLECTIONMAP_3D
+            const in samplerCube reflectionSampler,
+            const in vec3 reflectionCoords,
+        #else
+            const in sampler2D reflectionSampler,
+            const in vec2 reflectionCoords,
+        #endif
+        const in float NdotVUnclamped,
+        #ifndef LODBASEDMICROSFURACE
+            const in sampler2D reflectionSamplerLow,
+            const in sampler2D reflectionSamplerHigh,
+        #endif
+        const in vec3 environmentBrdf,
+        #if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)
+            const in float seo,
+        #endif
+        #if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)
+            const in float eho,
+        #endif
+    #endif
+        out sheenOutParams outParams
+    )
+    {
+        float sheenIntensity = vSheenColor.a;
+
+        #ifdef SHEEN_TEXTURE
+            vec4 sheenMapData = texture2D(sheenSampler, vSheenUV + uvOffset) * vSheenInfos.y;
+            sheenIntensity *= sheenMapData.a;
+            #if DEBUGMODE > 0
+                outParams.sheenMapData = sheenMapData;
+            #endif
+        #endif
+
+        #ifdef SHEEN_LINKWITHALBEDO
+            float sheenFactor = pow5(1.0-sheenIntensity);
+            vec3 sheenColor = baseColor.rgb*(1.0-sheenFactor);
+            float sheenRoughness = sheenIntensity;
+            outParams.surfaceAlbedo = surfaceAlbedo * sheenFactor;
+        #else
+            vec3 sheenColor = vSheenColor.rgb;
+            #ifdef SHEEN_TEXTURE
+                sheenColor.rgb *= toLinearSpace(sheenMapData.rgb);
+            #endif
+            
+            #ifdef SHEEN_ROUGHNESS
+                float sheenRoughness = vSheenRoughness;
+            #else
+                float sheenRoughness = roughness;
+            #endif
+
+            // Sheen Lobe Layering.
+            #if !defined(SHEEN_ALBEDOSCALING)
+                sheenIntensity *= (1. - reflectance);
+            #endif
+
+            // Remap F0 and sheen.
+            sheenColor *= sheenIntensity;
+        #endif
+
+        // _____________________________ Sheen Environment __________________________
+        #ifdef ENVIRONMENTBRDF
+                /*#ifdef SHEEN_SOFTER
+                vec3 environmentSheenBrdf = vec3(0., 0., getBRDFLookupCharlieSheen(NdotV, sheenRoughness));
+            #else*/
+                #ifdef SHEEN_ROUGHNESS
+                    vec3 environmentSheenBrdf = getBRDFLookup(NdotV, sheenRoughness);
+                #else
+                    vec3 environmentSheenBrdf = environmentBrdf;
+                #endif
+            /*#endif*/
+        #endif
+
+        #if defined(REFLECTION) && defined(ENVIRONMENTBRDF)
+            float sheenAlphaG = convertRoughnessToAverageSlope(sheenRoughness);
+
+            #ifdef SPECULARAA
+                // Adapt linear roughness (alphaG) to geometric curvature of the current pixel.
+                sheenAlphaG += AARoughnessFactors.y;
+            #endif
+
+            vec4 environmentSheenRadiance = vec4(0., 0., 0., 0.);
+
+            // _____________________________ 2D vs 3D Maps ________________________________
+            #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
+                float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG, NdotVUnclamped);
+            #elif defined(LINEARSPECULARREFLECTION)
+                float sheenReflectionLOD = getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x, sheenRoughness);
+            #else
+                float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG);
+            #endif
+
+            #ifdef LODBASEDMICROSFURACE
+                // Apply environment convolution scale/offset filter tuning parameters to the mipmap LOD selection
+                sheenReflectionLOD = sheenReflectionLOD * vReflectionMicrosurfaceInfos.y + vReflectionMicrosurfaceInfos.z;
+                environmentSheenRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, sheenReflectionLOD);
+            #else
+                float lodSheenReflectionNormalized = saturate(sheenReflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
+                float lodSheenReflectionNormalizedDoubled = lodSheenReflectionNormalized * 2.0;
+
+                vec4 environmentSheenMid = sampleReflection(reflectionSampler, reflectionCoords);
+                if (lodSheenReflectionNormalizedDoubled < 1.0){
+                    environmentSheenRadiance = mix(
+                        sampleReflection(reflectionSamplerHigh, reflectionCoords),
+                        environmentSheenMid,
+                        lodSheenReflectionNormalizedDoubled
+                    );
+                } else {
+                    environmentSheenRadiance = mix(
+                        environmentSheenMid,
+                        sampleReflection(reflectionSamplerLow, reflectionCoords),
+                        lodSheenReflectionNormalizedDoubled - 1.0
+                    );
+                }
+            #endif
+
+            #ifdef RGBDREFLECTION
+                environmentSheenRadiance.rgb = fromRGBD(environmentSheenRadiance);
+            #endif
+
+            #ifdef GAMMAREFLECTION
+                environmentSheenRadiance.rgb = toLinearSpace(environmentSheenRadiance.rgb);
+            #endif
+
+            // _____________________________ Levels _____________________________________
+            environmentSheenRadiance.rgb *= vReflectionInfos.x;
+            environmentSheenRadiance.rgb *= vReflectionColor.rgb;
+
+            vec3 sheenEnvironmentReflectance = getSheenReflectanceFromBRDFLookup(sheenColor, environmentSheenBrdf);
+
+            #if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION)
+                sheenEnvironmentReflectance *= seo;
+            #endif
+            #if !defined(REFLECTIONMAP_SKYBOX) && defined(HORIZONOCCLUSION) && defined(BUMP) && defined(REFLECTIONMAP_3D)
+                sheenEnvironmentReflectance *= eho;
+            #endif
+
+            #if DEBUGMODE > 0
+                outParams.sheenEnvironmentReflectance = sheenEnvironmentReflectance;
+            #endif
+
+            outParams.finalSheenRadianceScaled = 
+                environmentSheenRadiance.rgb *
+                sheenEnvironmentReflectance *
+                vLightingIntensity.z;
+
+            // #if defined(MS_BRDF_ENERGY_CONSERVATION)
+                // The sheen does not use the same BRDF so not energy conservation is possible
+                // Should be less a problem as it is usually not metallic
+                // finalSheenScaled *= energyConservationFactor;
+            // #endif
+        #endif
+
+        #if defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
+            // Sheen Lobe Layering.
+            // environmentSheenBrdf.b is (integral on hemisphere)[f_sheen*cos(theta)*dtheta*dphi], which happens to also be the directional albedo needed for albedo scaling.
+            // See section 6.2.3 in https://dassaultsystemes-technology.github.io/EnterprisePBRShadingModel/spec-2021x.md.html#components/sheen
+            outParams.sheenAlbedoScaling = 1.0 - sheenIntensity * max(max(sheenColor.r, sheenColor.g), sheenColor.b) * environmentSheenBrdf.b;
+        #endif
+
+        // _____________________________ Out parameters __________________________
+        outParams.sheenIntensity = sheenIntensity;
+        outParams.sheenColor = sheenColor;
+        outParams.sheenRoughness = sheenRoughness;
+    }
+#endif

+ 339 - 0
src/Shaders/ShadersInclude/pbrBlockSubSurface.fx

@@ -0,0 +1,339 @@
+struct subSurfaceOutParams
+{
+    vec3 specularEnvironmentReflectance;
+#ifdef SS_REFRACTION
+    vec3 finalRefraction;
+    vec3 surfaceAlbedo;
+    #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
+        float alpha;
+    #endif
+    #ifdef REFLECTION
+        float refractionFactorForIrradiance;
+    #endif
+#endif
+#ifdef SS_TRANSLUCENCY
+    vec3 transmittance;
+    #ifdef REFLECTION
+        vec3 refractionIrradiance;
+    #endif
+#endif
+#if DEBUGMODE > 0
+    vec4 thicknessMap;
+    vec4 environmentRefraction;
+    vec3 refractionTransmittance;
+#endif
+};
+
+#ifdef SUBSURFACE
+    void subSurfaceBlock(
+        const in vec2 vThicknessParam,
+        const in vec4 vTintColor,
+        const in vec3 normalW,
+        const in vec3 specularEnvironmentReflectance,
+    #ifdef SS_THICKNESSANDMASK_TEXTURE
+        const in vec2 vThicknessUV,
+        const in vec2 uvOffset,
+        const in sampler2D thicknessSampler,
+    #endif
+    #ifdef REFLECTION
+        #ifdef SS_TRANSLUCENCY
+            const in mat4 reflectionMatrix,
+            #ifdef USESPHERICALFROMREFLECTIONMAP
+                #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
+                    const in vec3 irradianceVector_,
+                #endif
+            #endif
+            #ifdef USEIRRADIANCEMAP
+                #ifdef REFLECTIONMAP_3D
+                    const in samplerCube irradianceSampler,
+                #else
+                    const in sampler2D irradianceSampler,
+                #endif
+            #endif
+        #endif
+    #endif
+    #ifdef SS_REFRACTION
+        const in vec3 vPositionW,
+        const in vec3 viewDirectionW,
+        const in mat4 view,
+        const in vec3 surfaceAlbedo,
+        const in vec4 vRefractionInfos,
+        const in mat4 refractionMatrix,
+        const in vec3 vRefractionMicrosurfaceInfos,
+        const in vec4 vLightingIntensity,
+        #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
+            const in float alpha,
+        #endif
+        #ifdef SS_LODINREFRACTIONALPHA
+            const in float NdotVUnclamped,
+        #endif
+        #ifdef SS_LINEARSPECULARREFRACTION
+            const in float roughness,
+        #else
+            const in float alphaG,
+        #endif
+        #ifdef SS_REFRACTIONMAP_3D
+            const in samplerCube refractionSampler,
+            #ifndef LODBASEDMICROSFURACE
+                const in samplerCube refractionSamplerLow,
+                const in samplerCube refractionSamplerHigh,
+            #endif
+        #else
+            const in sampler2D refractionSampler,
+            #ifndef LODBASEDMICROSFURACE
+                const in sampler2D refractionSamplerLow,
+                const in sampler2D refractionSamplerHigh,
+            #endif
+        #endif
+        #ifdef ANISOTROPIC
+            const in anisotropicOutParams anisotropicOut,
+        #endif
+    #endif
+    #ifdef SS_TRANSLUCENCY
+        const in vec3 vDiffusionDistance,
+    #endif
+        out subSurfaceOutParams outParams
+    )
+    {
+        outParams.specularEnvironmentReflectance = specularEnvironmentReflectance;
+
+    // ______________________________________________________________________________________
+    // _____________________________ Intensities & thickness ________________________________
+    // ______________________________________________________________________________________
+    #ifdef SS_REFRACTION
+        float refractionIntensity = vSubSurfaceIntensity.x;
+        #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
+            refractionIntensity *= (1.0 - alpha);
+            // Put alpha back to 1;
+            outParams.alpha = 1.0;
+        #endif
+    #endif
+    #ifdef SS_TRANSLUCENCY
+        float translucencyIntensity = vSubSurfaceIntensity.y;
+    #endif
+    #ifdef SS_SCATTERING
+        float scatteringIntensity = vSubSurfaceIntensity.z;
+    #endif
+
+    #ifdef SS_THICKNESSANDMASK_TEXTURE
+        vec4 thicknessMap = texture2D(thicknessSampler, vThicknessUV + uvOffset);
+        float thickness = thicknessMap.r * vThicknessParam.y + vThicknessParam.x;
+
+        #if DEBUGMODE > 0
+            outParams.thicknessMap = thicknessMap;
+        #endif
+
+        #ifdef SS_MASK_FROM_THICKNESS_TEXTURE
+            #ifdef SS_REFRACTION
+                refractionIntensity *= thicknessMap.g;
+            #endif
+            #ifdef SS_TRANSLUCENCY
+                translucencyIntensity *= thicknessMap.b;
+            #endif
+            #ifdef SS_SCATTERING
+                scatteringIntensity *= thicknessMap.a;
+            #endif
+        #endif
+    #else
+        float thickness = vThicknessParam.y;
+    #endif
+
+    // _________________________________________________________________________________________
+    // _____________________________ Translucency transmittance ________________________________
+    // _________________________________________________________________________________________
+    #ifdef SS_TRANSLUCENCY
+        thickness = maxEps(thickness);
+        vec3 transmittance = transmittanceBRDF_Burley(vTintColor.rgb, vDiffusionDistance, thickness);
+        transmittance *= translucencyIntensity;
+        outParams.transmittance = transmittance;
+    #endif
+
+    // _____________________________________________________________________________________
+    // _____________________________ Refraction environment ________________________________
+    // _____________________________________________________________________________________
+    #ifdef SS_REFRACTION
+        vec4 environmentRefraction = vec4(0., 0., 0., 0.);
+
+        #ifdef ANISOTROPIC
+            vec3 refractionVector = refract(-viewDirectionW, anisotropicOut.anisotropicNormal, vRefractionInfos.y);
+        #else
+            vec3 refractionVector = refract(-viewDirectionW, normalW, vRefractionInfos.y);
+        #endif
+
+        #ifdef SS_REFRACTIONMAP_OPPOSITEZ
+            refractionVector.z *= -1.0;
+        #endif
+
+        // _____________________________ 2D vs 3D Maps ________________________________
+        #ifdef SS_REFRACTIONMAP_3D
+            refractionVector.y = refractionVector.y * vRefractionInfos.w;
+            vec3 refractionCoords = refractionVector;
+            refractionCoords = vec3(refractionMatrix * vec4(refractionCoords, 0));
+        #else
+            vec3 vRefractionUVW = vec3(refractionMatrix * (view * vec4(vPositionW + refractionVector * vRefractionInfos.z, 1.0)));
+            vec2 refractionCoords = vRefractionUVW.xy / vRefractionUVW.z;
+            refractionCoords.y = 1.0 - refractionCoords.y;
+        #endif
+
+        #ifdef SS_LODINREFRACTIONALPHA
+            float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
+        #elif defined(SS_LINEARSPECULARREFRACTION)
+            float refractionLOD = getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x, roughness);
+        #else
+            float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG);
+        #endif
+
+        #ifdef LODBASEDMICROSFURACE
+            // Apply environment convolution scale/offset filter tuning parameters to the mipmap LOD selection
+            refractionLOD = refractionLOD * vRefractionMicrosurfaceInfos.y + vRefractionMicrosurfaceInfos.z;
+
+            #ifdef SS_LODINREFRACTIONALPHA
+                // Automatic LOD adjustment to ensure that the smoothness-based environment LOD selection
+                // is constrained to appropriate LOD levels in order to prevent aliasing.
+                // The environment map is first sampled without custom LOD selection to determine
+                // the hardware-selected LOD, and this is then used to constrain the final LOD selection
+                // so that excessive surface smoothness does not cause aliasing (e.g. on curved geometry
+                // where the normal is varying rapidly).
+
+                // Note: Shader Model 4.1 or higher can provide this directly via CalculateLevelOfDetail(), and
+                // manual calculation via derivatives is also possible, but for simplicity we use the 
+                // hardware LOD calculation with the alpha channel containing the LOD for each mipmap.
+                float automaticRefractionLOD = UNPACK_LOD(sampleRefraction(refractionSampler, refractionCoords).a);
+                float requestedRefractionLOD = max(automaticRefractionLOD, refractionLOD);
+            #else
+                float requestedRefractionLOD = refractionLOD;
+            #endif
+
+            environmentRefraction = sampleRefractionLod(refractionSampler, refractionCoords, requestedRefractionLOD);
+        #else
+            float lodRefractionNormalized = saturate(refractionLOD / log2(vRefractionMicrosurfaceInfos.x));
+            float lodRefractionNormalizedDoubled = lodRefractionNormalized * 2.0;
+
+            vec4 environmentRefractionMid = sampleRefraction(refractionSampler, refractionCoords);
+            if (lodRefractionNormalizedDoubled < 1.0){
+                environmentRefraction = mix(
+                    sampleRefraction(refractionSamplerHigh, refractionCoords),
+                    environmentRefractionMid,
+                    lodRefractionNormalizedDoubled
+                );
+            } else {
+                environmentRefraction = mix(
+                    environmentRefractionMid,
+                    sampleRefraction(refractionSamplerLow, refractionCoords),
+                    lodRefractionNormalizedDoubled - 1.0
+                );
+            }
+        #endif
+
+        #ifdef SS_RGBDREFRACTION
+            environmentRefraction.rgb = fromRGBD(environmentRefraction);
+        #endif
+
+        #ifdef SS_GAMMAREFRACTION
+            environmentRefraction.rgb = toLinearSpace(environmentRefraction.rgb);
+        #endif
+
+        // _____________________________ Levels _____________________________________
+        environmentRefraction.rgb *= vRefractionInfos.x;
+    #endif
+
+    // _______________________________________________________________________________
+    // _____________________________ Final Refraction ________________________________
+    // _______________________________________________________________________________
+    #ifdef SS_REFRACTION
+        vec3 refractionTransmittance = vec3(refractionIntensity);
+        #ifdef SS_THICKNESSANDMASK_TEXTURE
+            vec3 volumeAlbedo = computeColorAtDistanceInMedia(vTintColor.rgb, vTintColor.w);
+
+            // // Simulate Flat Surface
+            // thickness /=  dot(refractionVector, -normalW);
+
+            // // Simulate Curved Surface
+            // float NdotRefract = dot(normalW, refractionVector);
+            // thickness *= -NdotRefract;
+
+            refractionTransmittance *= cocaLambert(volumeAlbedo, thickness);
+        #elif defined(SS_LINKREFRACTIONTOTRANSPARENCY)
+            // Tint the material with albedo.
+            float maxChannel = max(max(surfaceAlbedo.r, surfaceAlbedo.g), surfaceAlbedo.b);
+            vec3 volumeAlbedo = saturate(maxChannel * surfaceAlbedo);
+
+            // Tint reflectance
+            environmentRefraction.rgb *= volumeAlbedo;
+        #else
+            // Compute tint from min distance only.
+            vec3 volumeAlbedo = computeColorAtDistanceInMedia(vTintColor.rgb, vTintColor.w);
+            refractionTransmittance *= cocaLambert(volumeAlbedo, vThicknessParam.y);
+        #endif
+
+        // Decrease Albedo Contribution
+        outParams.surfaceAlbedo = surfaceAlbedo * (1. - refractionIntensity);
+
+        #ifdef REFLECTION
+            // Decrease irradiance Contribution
+            outParams.refractionFactorForIrradiance = (1. - refractionIntensity);
+            //environmentIrradiance *= (1. - refractionIntensity);
+        #endif
+
+        // Add Multiple internal bounces.
+        vec3 bounceSpecularEnvironmentReflectance = (2.0 * specularEnvironmentReflectance) / (1.0 + specularEnvironmentReflectance);
+        outParams.specularEnvironmentReflectance = mix(bounceSpecularEnvironmentReflectance, specularEnvironmentReflectance, refractionIntensity);
+
+        // In theory T = 1 - R.
+        refractionTransmittance *= 1.0 - outParams.specularEnvironmentReflectance;
+
+        #if DEBUGMODE > 0
+            outParams.refractionTransmittance = refractionTransmittance;
+        #endif
+
+        outParams.finalRefraction = environmentRefraction.rgb * refractionTransmittance * vLightingIntensity.z;
+
+        #if DEBUGMODE > 0
+            outParams.environmentRefraction = environmentRefraction;
+        #endif
+    #endif
+
+    // __________________________________________________________________________________
+    // _______________________________  IBL Translucency ________________________________
+    // __________________________________________________________________________________
+    #if defined(REFLECTION) && defined(SS_TRANSLUCENCY)
+        #if defined(NORMAL) && defined(USESPHERICALINVERTEX) || !defined(USESPHERICALFROMREFLECTIONMAP)
+            vec3 irradianceVector = vec3(reflectionMatrix * vec4(normalW, 0)).xyz;
+            #ifdef REFLECTIONMAP_OPPOSITEZ
+                irradianceVector.z *= -1.0;
+            #endif
+        #else
+            vec3 irradianceVector = irradianceVector_;
+        #endif
+
+        #if defined(USESPHERICALFROMREFLECTIONMAP)
+            vec3 refractionIrradiance = computeEnvironmentIrradiance(-irradianceVector);
+        #elif defined(USEIRRADIANCEMAP)
+            #ifdef REFLECTIONMAP_3D
+                vec3 irradianceCoords = irradianceVector;
+            #else
+                vec2 irradianceCoords = irradianceVector.xy;
+                #ifdef REFLECTIONMAP_PROJECTION
+                    irradianceCoords /= irradianceVector.z;
+                #endif
+                irradianceCoords.y = 1.0 - irradianceCoords.y;
+            #endif
+
+            vec4 refractionIrradiance = sampleReflection(irradianceSampler, -irradianceCoords);
+            #ifdef RGBDREFLECTION
+                refractionIrradiance.rgb = fromRGBD(refractionIrradiance);
+            #endif
+
+            #ifdef GAMMAREFLECTION
+                refractionIrradiance.rgb = toLinearSpace(refractionIrradiance.rgb);
+            #endif
+        #else
+            vec4 refractionIrradiance = vec4(0.);
+        #endif
+
+        refractionIrradiance.rgb *= transmittance;
+        outParams.refractionIrradiance = refractionIrradiance.rgb;
+    #endif
+    }
+#endif
+

+ 30 - 30
src/Shaders/ShadersInclude/pbrDebug.fx

@@ -9,11 +9,11 @@
     #elif DEBUGMODE == 2 && defined(NORMAL)
         gl_FragColor.rgb = vNormalW.rgb;
         #define DEBUGMODE_NORMALIZE
-    #elif DEBUGMODE == 3 && (defined(BUMP) || defined(PARALLAX) || defined(ANISOTROPIC))
+    #elif DEBUGMODE == 3 && defined(BUMP) || DEBUGMODE == 3 && defined(PARALLAX) || DEBUGMODE == 3 && defined(ANISOTROPIC)
         // Tangents
         gl_FragColor.rgb = TBN[0];
         #define DEBUGMODE_NORMALIZE
-    #elif DEBUGMODE == 4 && (defined(BUMP) || defined(PARALLAX) || defined(ANISOTROPIC))
+    #elif DEBUGMODE == 4 && defined(BUMP) || DEBUGMODE == 4 && defined(PARALLAX) || DEBUGMODE == 4 && defined(ANISOTROPIC)
         // BiTangents
         gl_FragColor.rgb = TBN[1];
         #define DEBUGMODE_NORMALIZE
@@ -27,30 +27,30 @@
         gl_FragColor.rgb = vec3(vMainUV2, 0.0);
     #elif DEBUGMODE == 8 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)
         // ClearCoat Tangents
-        gl_FragColor.rgb = TBNClearCoat[0];
+        gl_FragColor.rgb = clearcoatOut.TBNClearCoat[0];
         #define DEBUGMODE_NORMALIZE
     #elif DEBUGMODE == 9 && defined(CLEARCOAT) && defined(CLEARCOAT_BUMP)
         // ClearCoat BiTangents
-        gl_FragColor.rgb = TBNClearCoat[1];
+        gl_FragColor.rgb = clearcoatOut.TBNClearCoat[1];
         #define DEBUGMODE_NORMALIZE
     #elif DEBUGMODE == 10 && defined(CLEARCOAT)
         // ClearCoat Bump Normals
-        gl_FragColor.rgb = clearCoatNormalW;
+        gl_FragColor.rgb = clearcoatOut.clearCoatNormalW;
         #define DEBUGMODE_NORMALIZE
     #elif DEBUGMODE == 11 && defined(ANISOTROPIC)
-        gl_FragColor.rgb = anisotropicNormal;
+        gl_FragColor.rgb = anisotropicOut.anisotropicNormal;
         #define DEBUGMODE_NORMALIZE
     #elif DEBUGMODE == 12 && defined(ANISOTROPIC)
-        gl_FragColor.rgb = anisotropicTangent;
+        gl_FragColor.rgb = anisotropicOut.anisotropicTangent;
         #define DEBUGMODE_NORMALIZE
     #elif DEBUGMODE == 13 && defined(ANISOTROPIC)
-        gl_FragColor.rgb = anisotropicBitangent;
+        gl_FragColor.rgb = anisotropicOut.anisotropicBitangent;
         #define DEBUGMODE_NORMALIZE
 // Maps
     #elif DEBUGMODE == 20 && defined(ALBEDO)
         gl_FragColor.rgb = albedoTexture.rgb;
     #elif DEBUGMODE == 21 && defined(AMBIENT)
-        gl_FragColor.rgb = ambientOcclusionColorMap.rgb;
+        gl_FragColor.rgb = aoOut.ambientOcclusionColorMap.rgb;
     #elif DEBUGMODE == 22 && defined(OPACITY)
         gl_FragColor.rgb = opacityMap.rgb;
     #elif DEBUGMODE == 23 && defined(EMISSIVE)
@@ -60,30 +60,30 @@
         gl_FragColor.rgb = lightmapColor.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 25 && defined(REFLECTIVITY) && defined(METALLICWORKFLOW)
-        gl_FragColor.rgb = surfaceMetallicColorMap.rgb;
+        gl_FragColor.rgb = reflectivityOut.surfaceMetallicColorMap.rgb;
     #elif DEBUGMODE == 26 && defined(REFLECTIVITY) && !defined(METALLICWORKFLOW)
-        gl_FragColor.rgb = surfaceReflectivityColorMap.rgb;
+        gl_FragColor.rgb = reflectivityOut.surfaceReflectivityColorMap.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 27 && defined(CLEARCOAT) && defined(CLEARCOAT_TEXTURE)
-        gl_FragColor.rgb = vec3(clearCoatMapData.rg, 0.0);
+        gl_FragColor.rgb = vec3(clearcoatOut.clearCoatMapData.rg, 0.0);
     #elif DEBUGMODE == 28 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT) && defined(CLEARCOAT_TINT_TEXTURE)
-        gl_FragColor.rgb = clearCoatTintMapData.rgb;
+        gl_FragColor.rgb = clearcoatOut.clearCoatTintMapData.rgb;
     #elif DEBUGMODE == 29 && defined(SHEEN) && defined(SHEEN_TEXTURE)
-        gl_FragColor.rgb = sheenMapData.rgb;
+        gl_FragColor.rgb = sheenOut.sheenMapData.rgb;
     #elif DEBUGMODE == 30 && defined(ANISOTROPIC) && defined(ANISOTROPIC_TEXTURE)
-        gl_FragColor.rgb = anisotropyMapData.rgb;
+        gl_FragColor.rgb = anisotropicOut.anisotropyMapData.rgb;
     #elif DEBUGMODE == 31 && defined(SUBSURFACE) && defined(SS_THICKNESSANDMASK_TEXTURE)
-        gl_FragColor.rgb = thicknessMap.rgb;
+        gl_FragColor.rgb = subSurfaceOut.thicknessMap.rgb;
 // Env
     #elif DEBUGMODE == 40 && defined(SS_REFRACTION)
         // Base color.
-        gl_FragColor.rgb = environmentRefraction.rgb;
+        gl_FragColor.rgb = subSurfaceOut.environmentRefraction.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 41 && defined(REFLECTION)
-        gl_FragColor.rgb = environmentRadiance.rgb;
+        gl_FragColor.rgb = reflectionOut.environmentRadiance.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 42 && defined(CLEARCOAT) && defined(REFLECTION)
-        gl_FragColor.rgb = environmentClearCoatRadiance;
+        gl_FragColor.rgb = clearcoatOut.environmentClearCoatRadiance.rgb;
         #define DEBUGMODE_GAMMA
 // Lighting
     #elif DEBUGMODE == 50
@@ -99,19 +99,19 @@
         gl_FragColor.rgb = sheenBase.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 54 && defined(REFLECTION)
-        gl_FragColor.rgb = environmentIrradiance.rgb;
+        gl_FragColor.rgb = reflectionOut.environmentIrradiance.rgb;
         #define DEBUGMODE_GAMMA
 // Lighting Params
     #elif DEBUGMODE == 60
         gl_FragColor.rgb = surfaceAlbedo.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 61
-        gl_FragColor.rgb = specularEnvironmentR0;
+        gl_FragColor.rgb = clearcoatOut.specularEnvironmentR0;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 62 && defined(METALLICWORKFLOW)
-        gl_FragColor.rgb = vec3(metallicRoughness.r);
+        gl_FragColor.rgb = vec3(reflectivityOut.metallicRoughness.r);
     #elif DEBUGMODE == 71 && defined(METALLICWORKFLOW)
-        gl_FragColor.rgb = metallicF0;
+        gl_FragColor.rgb = reflectivityOut.metallicF0;
     #elif DEBUGMODE == 63
         gl_FragColor.rgb = vec3(roughness);
     #elif DEBUGMODE == 64
@@ -119,16 +119,16 @@
     #elif DEBUGMODE == 65
         gl_FragColor.rgb = vec3(NdotV);
     #elif DEBUGMODE == 66 && defined(CLEARCOAT) && defined(CLEARCOAT_TINT)
-        gl_FragColor.rgb = clearCoatColor.rgb;
+        gl_FragColor.rgb = clearcoatOut.clearCoatColor.rgb;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 67 && defined(CLEARCOAT)
-        gl_FragColor.rgb = vec3(clearCoatRoughness);
+        gl_FragColor.rgb = vec3(clearcoatOut.clearCoatRoughness);
     #elif DEBUGMODE == 68 && defined(CLEARCOAT)
-        gl_FragColor.rgb = vec3(clearCoatNdotV);
+        gl_FragColor.rgb = vec3(clearcoatOut.clearCoatNdotV);
     #elif DEBUGMODE == 69 && defined(SUBSURFACE) && defined(SS_TRANSLUCENCY)
-        gl_FragColor.rgb = transmittance;
+        gl_FragColor.rgb = subSurfaceOut.transmittance;
     #elif DEBUGMODE == 70 && defined(SUBSURFACE) && defined(SS_REFRACTION)
-        gl_FragColor.rgb = refractionTransmittance;
+        gl_FragColor.rgb = subSurfaceOut.refractionTransmittance;
 // Misc
     #elif DEBUGMODE == 80 && defined(RADIANCEOCCLUSION)
         gl_FragColor.rgb = vec3(seo);
@@ -140,10 +140,10 @@
         gl_FragColor.rgb = specularEnvironmentReflectance;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 84 && defined(CLEARCOAT) && defined(ENVIRONMENTBRDF) && !defined(REFLECTIONMAP_SKYBOX)
-        gl_FragColor.rgb = clearCoatEnvironmentReflectance;
+        gl_FragColor.rgb = clearcoatOut.clearCoatEnvironmentReflectance;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 85 && defined(SHEEN) && defined(REFLECTION)
-        gl_FragColor.rgb = sheenEnvironmentReflectance;
+        gl_FragColor.rgb = sheenOut.sheenEnvironmentReflectance;
         #define DEBUGMODE_GAMMA
     #elif DEBUGMODE == 86 && defined(ALPHABLEND)
         gl_FragColor.rgb = vec3(luminanceOverAlpha);

Файловите разлики са ограничени, защото са твърде много
+ 266 - 1134
src/Shaders/pbr.fragment.fx


BIN
tests/validation/ReferenceImages/pbr_codecoverage.png


BIN
tests/validation/ReferenceImages/pbr_codecoverage1.png


BIN
tests/validation/ReferenceImages/pbr_codecoverage2.png


BIN
tests/validation/ReferenceImages/pbr_codecoverage3.png


+ 15 - 0
tests/validation/config.json

@@ -677,6 +677,21 @@
             "referenceImage": "pbr_refraction.png"
         },
         {
+            "title": "PBR shader code coverage #1",
+            "playgroundId": "#QI7TL3#16",
+            "referenceImage": "pbr_codecoverage1.png"
+        },
+        {
+            "title": "PBR shader code coverage #2",
+            "playgroundId": "#QI7TL3#17",
+            "referenceImage": "pbr_codecoverage2.png"
+        },
+        {
+            "title": "PBR shader code coverage #3",
+            "playgroundId": "#QI7TL3#18",
+            "referenceImage": "pbr_codecoverage3.png"
+        },
+                {
             "title": "Texture cache",
             "playgroundId": "#20OAV9#237",
             "referenceImage": "texture cache.png"

+ 1 - 0
tests/validation/validation.js

@@ -33,6 +33,7 @@ function compare(renderData, referenceCanvas, threshold, errorRatio) {
         referenceData.data[index] = 255;
         referenceData.data[index + 1] *= 0.5;
         referenceData.data[index + 2] *= 0.5;
+        referenceData.data[index + 3] = 255;
         differencesCount++;
     }