Browse Source

Merge branch 'master' into new-hit-test

Raanan Weber 5 years ago
parent
commit
5053ceca8a
56 changed files with 1445 additions and 376 deletions
  1. 13 13
      azure-pipelines-cd.yml
  2. 7 1
      contributing.md
  3. 115 3
      dist/preview release/babylon.d.ts
  4. 2 2
      dist/preview release/babylon.js
  5. 237 152
      dist/preview release/babylon.max.js
  6. 1 1
      dist/preview release/babylon.max.js.map
  7. 231 6
      dist/preview release/babylon.module.d.ts
  8. 115 3
      dist/preview release/documentation.d.ts
  9. 1 1
      dist/preview release/glTF2Interface/package.json
  10. 10 6
      dist/preview release/gui/babylon.gui.js
  11. 1 1
      dist/preview release/gui/babylon.gui.js.map
  12. 1 1
      dist/preview release/gui/babylon.gui.min.js
  13. 2 2
      dist/preview release/gui/package.json
  14. 7 7
      dist/preview release/inspector/package.json
  15. 3 3
      dist/preview release/loaders/package.json
  16. 2 2
      dist/preview release/materialsLibrary/package.json
  17. 30 30
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js
  18. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map
  19. 2 2
      dist/preview release/nodeEditor/package.json
  20. 1 1
      dist/preview release/package.json
  21. 1 1
      dist/preview release/packagesSizeBaseLine.json
  22. 2 2
      dist/preview release/postProcessesLibrary/package.json
  23. 2 2
      dist/preview release/proceduralTexturesLibrary/package.json
  24. 8 8
      dist/preview release/recast.js
  25. 3 3
      dist/preview release/serializers/package.json
  26. 231 6
      dist/preview release/viewer/babylon.module.d.ts
  27. 23 23
      dist/preview release/viewer/babylon.viewer.js
  28. 1 1
      dist/preview release/viewer/babylon.viewer.max.js
  29. 11 0
      dist/preview release/what's new.md
  30. 1 1
      dist/readme.md
  31. 4 4
      gui/src/2D/advancedDynamicTexture.ts
  32. 1 1
      package.json
  33. 10 6
      src/Behaviors/Meshes/sixDofDragBehavior.ts
  34. 3 0
      src/Collisions/collider.ts
  35. 6 3
      src/Collisions/collisionCoordinator.ts
  36. 1 0
      src/Collisions/meshCollisionData.ts
  37. 2 2
      src/Engines/thinEngine.ts
  38. 10 2
      src/Gizmos/boundingBoxGizmo.ts
  39. 17 2
      src/Lights/Shadows/cascadedShadowGenerator.ts
  40. 7 0
      src/Lights/Shadows/shadowGenerator.ts
  41. 0 32
      src/Loading/Plugins/babylonFileLoader.ts
  42. 17 0
      src/Materials/Node/nodeMaterial.ts
  43. 11 1
      src/Materials/Textures/renderTargetTexture.ts
  44. 2 1
      src/Materials/effectRenderer.ts
  45. 110 24
      src/Materials/fresnelParameters.ts
  46. 3 3
      src/Maths/math.plane.ts
  47. 17 0
      src/Meshes/abstractMesh.ts
  48. 2 2
      src/Meshes/transformNode.ts
  49. 12 0
      src/Navigation/INavigationEngine.ts
  50. 36 0
      src/Navigation/Plugins/recastJSPlugin.ts
  51. 1 1
      src/Shaders/ShadersInclude/bumpVertex.fx
  52. 1 1
      src/Shaders/ShadersInclude/bumpVertexDeclaration.fx
  53. 2 2
      src/Shaders/ShadersInclude/pbrIBLFunctions.fx
  54. 9 3
      src/Shaders/pbr.fragment.fx
  55. 94 0
      tests/unit/babylon/src/Materials/babylon.fresnelParameters.tests.ts
  56. 2 1
      tests/unit/karma.conf.js

+ 13 - 13
azure-pipelines-cd.yml

@@ -52,18 +52,18 @@ jobs:
 #      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
 #      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
 #      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
 #      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
 # babylonjs-preview
 # babylonjs-preview
-  - script: 'npx netlify unlink'
-    displayName: 'netlify unlink'
-  - script: 'npx netlify link --id=e1c1c520-e3a4-4d5b-91e6-254f1bea1b6b'
-    displayName: 'netlify link babylonjs-preview'
-    env:
-      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
-      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
-  - script: 'npx netlify deploy --prod --dir="dist/preview release"'
-    displayName: 'netlify deploy babylonjs-preview'
-    env:
-      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
-      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
+#  - script: 'npx netlify unlink'
+#    displayName: 'netlify unlink'
+#  - script: 'npx netlify link --id=e1c1c520-e3a4-4d5b-91e6-254f1bea1b6b'
+#    displayName: 'netlify link babylonjs-preview'
+#    env:
+#      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
+#      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
+#  - script: 'npx netlify deploy --prod --dir="dist/preview release"'
+#    displayName: 'netlify deploy babylonjs-preview'
+#    env:
+#      AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
+#      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
 # assets-babylonjs
 # assets-babylonjs
   - script: 'npx netlify unlink'
   - script: 'npx netlify unlink'
     displayName: 'netlify unlink'
     displayName: 'netlify unlink'
@@ -106,4 +106,4 @@ jobs:
     displayName: 'netlify deploy viewer-babylonjs'
     displayName: 'netlify deploy viewer-babylonjs'
     env:
     env:
       AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
       AZURE_PULLREQUESTID: $(System.PullRequest.PullRequestId)
-      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)
+      NETLIFY_AUTH_TOKEN: $(babylon.netlify.authToken)

+ 7 - 1
contributing.md

@@ -37,7 +37,13 @@ We will try to enforce these rules as we consider the forum is a better place fo
 
 
 ## Online one-click setup for Contributing
 ## Online one-click setup for Contributing
 
 
-Contribute to BabylonJS using a fully featured online development environment; cloned repo, pre-installed dependencies, running web server.
+You can use Gitpod (A free online VS Code like IDE) for contributing online. With a single click it'll launch a workspace and automatically:
+
+- clone the BabylonJS repo.
+- install the dependencies.
+- run `npm run start` in `Tools/Gulp`.
+
+so that you can start straight away.
 
 
 [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/)
 [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/)
 
 

+ 115 - 3
dist/preview release/babylon.d.ts

@@ -20514,6 +20514,10 @@ declare module BABYLON {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -26043,6 +26047,56 @@ declare module BABYLON {
 }
 }
 declare module BABYLON {
 declare module BABYLON {
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -26070,21 +26124,33 @@ declare module BABYLON {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module BABYLON {
 declare module BABYLON {
@@ -27843,6 +27909,7 @@ declare module BABYLON {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -28165,6 +28232,17 @@ declare module BABYLON {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -39508,6 +39586,7 @@ declare module BABYLON {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -48740,8 +48819,9 @@ declare module BABYLON {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -54554,6 +54634,10 @@ declare module BABYLON {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -57452,6 +57536,11 @@ declare module BABYLON {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -61162,6 +61251,9 @@ declare module BABYLON {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -62168,6 +62260,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -62469,6 +62571,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */

File diff suppressed because it is too large
+ 2 - 2
dist/preview release/babylon.js


File diff suppressed because it is too large
+ 237 - 152
dist/preview release/babylon.max.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/babylon.max.js.map


+ 231 - 6
dist/preview release/babylon.module.d.ts

@@ -21149,6 +21149,10 @@ declare module "babylonjs/Materials/Textures/renderTargetTexture" {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -26809,8 +26813,59 @@ declare module "babylonjs/Meshes/Builders/discBuilder" {
     }
     }
 }
 }
 declare module "babylonjs/Materials/fresnelParameters" {
 declare module "babylonjs/Materials/fresnelParameters" {
+    import { DeepImmutable } from "babylonjs/types";
     import { Color3 } from "babylonjs/Maths/math.color";
     import { Color3 } from "babylonjs/Maths/math.color";
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -26838,21 +26893,33 @@ declare module "babylonjs/Materials/fresnelParameters" {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module "babylonjs/Materials/pushMaterial" {
 declare module "babylonjs/Materials/pushMaterial" {
@@ -28701,6 +28768,7 @@ declare module "babylonjs/Collisions/meshCollisionData" {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -29047,6 +29115,17 @@ declare module "babylonjs/Meshes/abstractMesh" {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -40750,6 +40829,7 @@ declare module "babylonjs/Behaviors/Meshes/sixDofDragBehavior" {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -50715,8 +50795,9 @@ declare module "babylonjs/Gizmos/boundingBoxGizmo" {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -56975,6 +57056,10 @@ declare module "babylonjs/Lights/Shadows/cascadedShadowGenerator" {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -60114,6 +60199,11 @@ declare module "babylonjs/Materials/Node/nodeMaterial" {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -64280,6 +64370,9 @@ declare module "babylonjs/Meshes/meshBuilder" {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -65347,6 +65440,16 @@ declare module "babylonjs/Navigation/INavigationEngine" {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -65653,6 +65756,16 @@ declare module "babylonjs/Navigation/Plugins/recastJSPlugin" {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -94190,6 +94303,10 @@ declare module BABYLON {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -99719,6 +99836,56 @@ declare module BABYLON {
 }
 }
 declare module BABYLON {
 declare module BABYLON {
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -99746,21 +99913,33 @@ declare module BABYLON {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module BABYLON {
 declare module BABYLON {
@@ -101519,6 +101698,7 @@ declare module BABYLON {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -101841,6 +102021,17 @@ declare module BABYLON {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -113184,6 +113375,7 @@ declare module BABYLON {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -122416,8 +122608,9 @@ declare module BABYLON {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -128230,6 +128423,10 @@ declare module BABYLON {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -131128,6 +131325,11 @@ declare module BABYLON {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -134838,6 +135040,9 @@ declare module BABYLON {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -135844,6 +136049,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -136145,6 +136360,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */

+ 115 - 3
dist/preview release/documentation.d.ts

@@ -20514,6 +20514,10 @@ declare module BABYLON {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -26043,6 +26047,56 @@ declare module BABYLON {
 }
 }
 declare module BABYLON {
 declare module BABYLON {
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -26070,21 +26124,33 @@ declare module BABYLON {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module BABYLON {
 declare module BABYLON {
@@ -27843,6 +27909,7 @@ declare module BABYLON {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -28165,6 +28232,17 @@ declare module BABYLON {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -39508,6 +39586,7 @@ declare module BABYLON {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -48740,8 +48819,9 @@ declare module BABYLON {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -54554,6 +54634,10 @@ declare module BABYLON {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -57452,6 +57536,11 @@ declare module BABYLON {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -61162,6 +61251,9 @@ declare module BABYLON {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -62168,6 +62260,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -62469,6 +62571,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */

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

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

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

@@ -1103,28 +1103,32 @@ var AdvancedDynamicTexture = /** @class */ (function (_super) {
                 return;
                 return;
             }
             }
             var globalViewport = this._getGlobalViewport(scene);
             var globalViewport = this._getGlobalViewport(scene);
-            for (var _i = 0, _a = this._linkedControls; _i < _a.length; _i++) {
-                var control = _a[_i];
+            var _loop_1 = function (control) {
                 if (!control.isVisible) {
                 if (!control.isVisible) {
-                    continue;
+                    return "continue";
                 }
                 }
                 var mesh = control._linkedMesh;
                 var mesh = control._linkedMesh;
                 if (!mesh || mesh.isDisposed()) {
                 if (!mesh || mesh.isDisposed()) {
                     babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Tools"].SetImmediate(function () {
                     babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Tools"].SetImmediate(function () {
                         control.linkWithMesh(null);
                         control.linkWithMesh(null);
                     });
                     });
-                    continue;
+                    return "continue";
                 }
                 }
                 var position = mesh.getBoundingInfo ? mesh.getBoundingInfo().boundingSphere.center : babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Vector3"].ZeroReadOnly;
                 var position = mesh.getBoundingInfo ? mesh.getBoundingInfo().boundingSphere.center : babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Vector3"].ZeroReadOnly;
                 var projectedPosition = babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Vector3"].Project(position, mesh.getWorldMatrix(), scene.getTransformMatrix(), globalViewport);
                 var projectedPosition = babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_1__["Vector3"].Project(position, mesh.getWorldMatrix(), scene.getTransformMatrix(), globalViewport);
                 if (projectedPosition.z < 0 || projectedPosition.z > 1) {
                 if (projectedPosition.z < 0 || projectedPosition.z > 1) {
                     control.notRenderable = true;
                     control.notRenderable = true;
-                    continue;
+                    return "continue";
                 }
                 }
                 control.notRenderable = false;
                 control.notRenderable = false;
                 // Account for RenderScale.
                 // Account for RenderScale.
-                projectedPosition.scaleInPlace(this.renderScale);
+                projectedPosition.scaleInPlace(this_1.renderScale);
                 control._moveToProjectedPosition(projectedPosition);
                 control._moveToProjectedPosition(projectedPosition);
+            };
+            var this_1 = this;
+            for (var _i = 0, _a = this._linkedControls; _i < _a.length; _i++) {
+                var control = _a[_i];
+                _loop_1(control);
             }
             }
         }
         }
         if (!this._isDirty && !this._rootContainer.isDirty) {
         if (!this._isDirty && !this._rootContainer.isDirty) {

File diff suppressed because it is too large
+ 1 - 1
dist/preview release/gui/babylon.gui.js.map


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/gui/babylon.gui.min.js


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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-gui",
     "name": "babylonjs-gui",
     "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
     "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,7 +28,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2"
     },
     },
     "engines": {
     "engines": {
         "node": "*"
         "node": "*"

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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-inspector",
     "name": "babylonjs-inspector",
     "description": "The Babylon.js inspector.",
     "description": "The Babylon.js inspector.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -29,12 +29,12 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1",
-        "babylonjs-gui": "4.2.0-alpha.1",
-        "babylonjs-loaders": "4.2.0-alpha.1",
-        "babylonjs-materials": "4.2.0-alpha.1",
-        "babylonjs-serializers": "4.2.0-alpha.1",
-        "babylonjs-gltf2interface": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2",
+        "babylonjs-gui": "4.2.0-alpha.2",
+        "babylonjs-loaders": "4.2.0-alpha.2",
+        "babylonjs-materials": "4.2.0-alpha.2",
+        "babylonjs-serializers": "4.2.0-alpha.2",
+        "babylonjs-gltf2interface": "4.2.0-alpha.2"
     },
     },
     "devDependencies": {
     "devDependencies": {
         "@types/react": "~16.7.3",
         "@types/react": "~16.7.3",

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

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

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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-materials",
     "name": "babylonjs-materials",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,7 +28,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2"
     },
     },
     "engines": {
     "engines": {
         "node": "*"
         "node": "*"

+ 30 - 30
dist/preview release/nodeEditor/babylon.nodeEditor.max.js

@@ -7,7 +7,7 @@
 		exports["babylonjs-node-editor"] = factory(require("babylonjs"));
 		exports["babylonjs-node-editor"] = factory(require("babylonjs"));
 	else
 	else
 		root["NODEEDITOR"] = factory(root["BABYLON"]);
 		root["NODEEDITOR"] = factory(root["BABYLON"]);
-})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), function(__WEBPACK_EXTERNAL_MODULE_babylonjs_Materials_Textures_texture__) {
+})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), function(__WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_observable__) {
 return /******/ (function(modules) { // webpackBootstrap
 return /******/ (function(modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
 /******/ 	var installedModules = {};
@@ -49933,7 +49933,7 @@ module.exports = function(module) {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BlockTools", function() { return BlockTools; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BlockTools", function() { return BlockTools; });
-/* harmony import */ var babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/Fragment/discardBlock */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/Fragment/discardBlock */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_Fragment_discardBlock__WEBPACK_IMPORTED_MODULE_0__);
 
 
 
 
@@ -50751,7 +50751,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_2__);
 
 
 
 
@@ -50834,7 +50834,7 @@ var PreviewAreaComponent = /** @class */ (function (_super) {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PreviewManager", function() { return PreviewManager; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PreviewManager", function() { return PreviewManager; });
-/* harmony import */ var babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/nodeMaterial */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/nodeMaterial */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_nodeMaterial__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _previewMeshType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./previewMeshType */ "./components/preview/previewMeshType.ts");
 /* harmony import */ var _previewMeshType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./previewMeshType */ "./components/preview/previewMeshType.ts");
 /* harmony import */ var _log_logComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../log/logComponent */ "./components/log/logComponent.tsx");
 /* harmony import */ var _log_logComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../log/logComponent */ "./components/log/logComponent.tsx");
@@ -51139,7 +51139,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _previewMeshType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./previewMeshType */ "./components/preview/previewMeshType.ts");
 /* harmony import */ var _previewMeshType__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./previewMeshType */ "./components/preview/previewMeshType.ts");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
@@ -51669,7 +51669,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _stringTools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../stringTools */ "./stringTools.ts");
 /* harmony import */ var _stringTools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../stringTools */ "./stringTools.ts");
 /* harmony import */ var _sharedComponents_fileButtonLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/fileButtonLineComponent */ "./sharedComponents/fileButtonLineComponent.tsx");
 /* harmony import */ var _sharedComponents_fileButtonLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/fileButtonLineComponent */ "./sharedComponents/fileButtonLineComponent.tsx");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6__);
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_6__);
 /* harmony import */ var _serializationTools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../serializationTools */ "./serializationTools.ts");
 /* harmony import */ var _serializationTools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../serializationTools */ "./serializationTools.ts");
 /* harmony import */ var _sharedComponents_checkBoxLineComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../sharedComponents/checkBoxLineComponent */ "./sharedComponents/checkBoxLineComponent.tsx");
 /* harmony import */ var _sharedComponents_checkBoxLineComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../sharedComponents/checkBoxLineComponent */ "./sharedComponents/checkBoxLineComponent.tsx");
@@ -51981,7 +51981,7 @@ var GradientDisplayManager = /** @class */ (function () {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputDisplayManager", function() { return InputDisplayManager; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputDisplayManager", function() { return InputDisplayManager; });
-/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialSystemValues */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialSystemValues */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialSystemValues__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../blockTools */ "./blockTools.ts");
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../blockTools */ "./blockTools.ts");
 /* harmony import */ var _stringTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stringTools */ "./stringTools.ts");
 /* harmony import */ var _stringTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stringTools */ "./stringTools.ts");
@@ -52198,7 +52198,7 @@ var RemapDisplayManager = /** @class */ (function () {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextureDisplayManager", function() { return TextureDisplayManager; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextureDisplayManager", function() { return TextureDisplayManager; });
-/* harmony import */ var babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/Dual/textureBlock */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/Dual/textureBlock */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_Dual_textureBlock__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _sharedComponents_textureLineComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../sharedComponents/textureLineComponent */ "./sharedComponents/textureLineComponent.tsx");
 /* harmony import */ var _sharedComponents_textureLineComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../sharedComponents/textureLineComponent */ "./sharedComponents/textureLineComponent.tsx");
 
 
@@ -52264,7 +52264,7 @@ var TextureDisplayManager = /** @class */ (function () {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TrigonometryDisplayManager", function() { return TrigonometryDisplayManager; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TrigonometryDisplayManager", function() { return TrigonometryDisplayManager; });
-/* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/trigonometryBlock */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/trigonometryBlock */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_0__);
 
 
 var TrigonometryDisplayManager = /** @class */ (function () {
 var TrigonometryDisplayManager = /** @class */ (function () {
@@ -52384,7 +52384,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _graphNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./graphNode */ "./diagram/graphNode.ts");
 /* harmony import */ var _graphNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./graphNode */ "./diagram/graphNode.ts");
 /* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dagre */ "../../node_modules/dagre/index.js");
 /* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dagre */ "../../node_modules/dagre/index.js");
@@ -53141,7 +53141,7 @@ var GraphCanvasComponent = /** @class */ (function (_super) {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GraphFrame", function() { return GraphFrame; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GraphFrame", function() { return GraphFrame; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/observable");
 /* 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 babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _nodePort__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodePort */ "./diagram/nodePort.ts");
 /* harmony import */ var _nodePort__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodePort */ "./diagram/nodePort.ts");
 /* harmony import */ var _serializationTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../serializationTools */ "./serializationTools.ts");
 /* harmony import */ var _serializationTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../serializationTools */ "./serializationTools.ts");
@@ -54604,7 +54604,7 @@ var GraphNode = /** @class */ (function () {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodeLink", function() { return NodeLink; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodeLink", function() { return NodeLink; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/observable");
 /* 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 babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 
 
 var NodeLink = /** @class */ (function () {
 var NodeLink = /** @class */ (function () {
@@ -54758,7 +54758,7 @@ var NodeLink = /** @class */ (function () {
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodePort", function() { return NodePort; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodePort", function() { return NodePort; });
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../blockTools */ "./blockTools.ts");
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../blockTools */ "./blockTools.ts");
-/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_1__);
 
 
 
 
@@ -55052,7 +55052,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
-/* harmony import */ var babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/gradientBlock */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/gradientBlock */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3__);
 /* harmony import */ var babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_gradientBlock__WEBPACK_IMPORTED_MODULE_3__);
 /* harmony import */ var _gradientStepComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./gradientStepComponent */ "./diagram/properties/gradientStepComponent.tsx");
 /* harmony import */ var _gradientStepComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./gradientStepComponent */ "./diagram/properties/gradientStepComponent.tsx");
 /* harmony import */ var _sharedComponents_buttonLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/buttonLineComponent */ "./sharedComponents/buttonLineComponent.tsx");
 /* harmony import */ var _sharedComponents_buttonLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/buttonLineComponent */ "./sharedComponents/buttonLineComponent.tsx");
@@ -55137,7 +55137,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ "../../node_modules/@fortawesome/free-solid-svg-icons/index.es.js");
 /* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ "../../node_modules/@fortawesome/free-solid-svg-icons/index.es.js");
-/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_4__);
 
 
 
 
@@ -55206,7 +55206,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _components_propertyTab_properties_matrixPropertyTabComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../components/propertyTab/properties/matrixPropertyTabComponent */ "./components/propertyTab/properties/matrixPropertyTabComponent.tsx");
 /* harmony import */ var _components_propertyTab_properties_matrixPropertyTabComponent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../components/propertyTab/properties/matrixPropertyTabComponent */ "./components/propertyTab/properties/matrixPropertyTabComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
-/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12__);
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_12__);
 /* harmony import */ var _genericNodePropertyComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./genericNodePropertyComponent */ "./diagram/properties/genericNodePropertyComponent.tsx");
 /* harmony import */ var _genericNodePropertyComponent__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./genericNodePropertyComponent */ "./diagram/properties/genericNodePropertyComponent.tsx");
 /* harmony import */ var _sharedComponents_textInputLineComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../sharedComponents/textInputLineComponent */ "./sharedComponents/textInputLineComponent.tsx");
 /* harmony import */ var _sharedComponents_textInputLineComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../sharedComponents/textInputLineComponent */ "./sharedComponents/textInputLineComponent.tsx");
@@ -55631,7 +55631,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _sharedComponents_fileButtonLineComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/fileButtonLineComponent */ "./sharedComponents/fileButtonLineComponent.tsx");
 /* harmony import */ var _sharedComponents_fileButtonLineComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/fileButtonLineComponent */ "./sharedComponents/fileButtonLineComponent.tsx");
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3__);
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_3__);
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_textInputLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/textInputLineComponent */ "./sharedComponents/textInputLineComponent.tsx");
 /* harmony import */ var _sharedComponents_textInputLineComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../sharedComponents/textInputLineComponent */ "./sharedComponents/textInputLineComponent.tsx");
@@ -55940,7 +55940,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_lineContainerComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../sharedComponents/lineContainerComponent */ "./sharedComponents/lineContainerComponent.tsx");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
 /* harmony import */ var _sharedComponents_optionsLineComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../sharedComponents/optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
-/* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/trigonometryBlock */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Materials/Node/Blocks/trigonometryBlock */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Blocks_trigonometryBlock__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var _genericNodePropertyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./genericNodePropertyComponent */ "./diagram/properties/genericNodePropertyComponent.tsx");
 /* harmony import */ var _genericNodePropertyComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./genericNodePropertyComponent */ "./diagram/properties/genericNodePropertyComponent.tsx");
 
 
@@ -56100,7 +56100,7 @@ PropertyLedger.RegisteredControls["TrigonometryBlock"] = _properties_trigonometr
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalState", function() { return GlobalState; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalState", function() { return GlobalState; });
-/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/observable */ "babylonjs/Misc/observable");
 /* 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 babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_observable__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var _components_preview_previewMeshType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/preview/previewMeshType */ "./components/preview/previewMeshType.ts");
 /* harmony import */ var _components_preview_previewMeshType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/preview/previewMeshType */ "./components/preview/previewMeshType.ts");
 
 
@@ -56167,7 +56167,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _components_propertyTab_propertyTabComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/propertyTab/propertyTabComponent */ "./components/propertyTab/propertyTabComponent.tsx");
 /* harmony import */ var _components_propertyTab_propertyTabComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/propertyTab/propertyTabComponent */ "./components/propertyTab/propertyTabComponent.tsx");
 /* harmony import */ var _portal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./portal */ "./portal.tsx");
 /* harmony import */ var _portal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./portal */ "./portal.tsx");
 /* harmony import */ var _components_log_logComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/log/logComponent */ "./components/log/logComponent.tsx");
 /* harmony import */ var _components_log_logComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/log/logComponent */ "./components/log/logComponent.tsx");
-/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6__);
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_6__);
 /* harmony import */ var _sharedComponents_messageDialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sharedComponents/messageDialog */ "./sharedComponents/messageDialog.tsx");
 /* harmony import */ var _sharedComponents_messageDialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sharedComponents/messageDialog */ "./sharedComponents/messageDialog.tsx");
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./blockTools */ "./blockTools.ts");
 /* harmony import */ var _blockTools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./blockTools */ "./blockTools.ts");
@@ -57023,7 +57023,7 @@ var Portal = /** @class */ (function (_super) {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SerializationTools", function() { return SerializationTools; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SerializationTools", function() { return SerializationTools; });
-/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Textures/texture */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Textures_texture__WEBPACK_IMPORTED_MODULE_0__);
 
 
 
 
@@ -57192,7 +57192,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _numericInputComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./numericInputComponent */ "./sharedComponents/numericInputComponent.tsx");
 /* harmony import */ var _numericInputComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./numericInputComponent */ "./sharedComponents/numericInputComponent.tsx");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
@@ -57339,7 +57339,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.color */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_color__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _numericInputComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./numericInputComponent */ "./sharedComponents/numericInputComponent.tsx");
 /* harmony import */ var _numericInputComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./numericInputComponent */ "./sharedComponents/numericInputComponent.tsx");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
@@ -57671,7 +57671,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @fortawesome/react-fontawesome */ "../../node_modules/@fortawesome/react-fontawesome/index.es.js");
 /* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ "../../node_modules/@fortawesome/free-solid-svg-icons/index.es.js");
 /* harmony import */ var _fortawesome_free_solid_svg_icons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fortawesome/free-solid-svg-icons */ "../../node_modules/@fortawesome/free-solid-svg-icons/index.es.js");
-/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! babylonjs/Misc/dataStorage */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_dataStorage__WEBPACK_IMPORTED_MODULE_4__);
 
 
 
 
@@ -57729,7 +57729,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Maths/math.vector */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math_vector__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var _vector4LineComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vector4LineComponent */ "./sharedComponents/vector4LineComponent.tsx");
 /* harmony import */ var _vector4LineComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vector4LineComponent */ "./sharedComponents/vector4LineComponent.tsx");
 /* harmony import */ var _optionsLineComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
 /* harmony import */ var _optionsLineComponent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./optionsLineComponent */ "./sharedComponents/optionsLineComponent.tsx");
@@ -58153,7 +58153,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_2__);
 
 
 
 
@@ -58385,7 +58385,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 tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "../../node_modules/tslib/tslib.es6.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../node_modules/react/index.js");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Engines/constants */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! babylonjs/Engines/constants */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2__);
 /* harmony import */ var babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_constants__WEBPACK_IMPORTED_MODULE_2__);
 
 
 
 
@@ -58864,7 +58864,7 @@ var Vector4LineComponent = /** @class */ (function (_super) {
 "use strict";
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StringTools", function() { return StringTools; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StringTools", function() { return StringTools; });
-/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Materials/Textures/texture");
+/* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes */ "babylonjs/Misc/observable");
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_Node_Enums_nodeMaterialBlockConnectionPointTypes__WEBPACK_IMPORTED_MODULE_0__);
 
 
 var StringTools = /** @class */ (function () {
 var StringTools = /** @class */ (function () {
@@ -58963,14 +58963,14 @@ var StringTools = /** @class */ (function () {
 
 
 /***/ }),
 /***/ }),
 
 
-/***/ "babylonjs/Materials/Textures/texture":
+/***/ "babylonjs/Misc/observable":
 /*!****************************************************************************************************!*\
 /*!****************************************************************************************************!*\
   !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
   !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
   \****************************************************************************************************/
   \****************************************************************************************************/
 /*! no static exports found */
 /*! no static exports found */
 /***/ (function(module, exports) {
 /***/ (function(module, exports) {
 
 
-module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Materials_Textures_texture__;
+module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_observable__;
 
 
 /***/ })
 /***/ })
 
 

File diff suppressed because it is too large
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map


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

@@ -4,14 +4,14 @@
     },
     },
     "name": "babylonjs-node-editor",
     "name": "babylonjs-node-editor",
     "description": "The Babylon.js node material editor.",
     "description": "The Babylon.js node material editor.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
     },
     },
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2"
     },
     },
     "files": [
     "files": [
         "babylon.nodeEditor.max.js.map",
         "babylon.nodeEditor.max.js.map",

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

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

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

@@ -1 +1 @@
-{"thinEngineOnly":113430,"engineOnly":150033,"sceneOnly":506727,"minGridMaterial":638618,"minStandardMaterial":779376}
+{"thinEngineOnly":113430,"engineOnly":150033,"sceneOnly":506974,"minGridMaterial":638865,"minStandardMaterial":779623}

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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-post-process",
     "name": "babylonjs-post-process",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,7 +28,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2"
     },
     },
     "engines": {
     "engines": {
         "node": "*"
         "node": "*"

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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-procedural-textures",
     "name": "babylonjs-procedural-textures",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
     "description": "The Babylon.js materials library is a collection of advanced materials to be used in a Babylon.js scene.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,7 +28,7 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2"
     },
     },
     "engines": {
     "engines": {
         "node": "*"
         "node": "*"

File diff suppressed because it is too large
+ 8 - 8
dist/preview release/recast.js


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

@@ -4,7 +4,7 @@
     },
     },
     "name": "babylonjs-serializers",
     "name": "babylonjs-serializers",
     "description": "The Babylon.js serializers library is an extension you can use to serialize Babylon scenes.",
     "description": "The Babylon.js serializers library is an extension you can use to serialize Babylon scenes.",
-    "version": "4.2.0-alpha.1",
+    "version": "4.2.0-alpha.2",
     "repository": {
     "repository": {
         "type": "git",
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,8 +28,8 @@
     ],
     ],
     "license": "Apache-2.0",
     "license": "Apache-2.0",
     "dependencies": {
     "dependencies": {
-        "babylonjs": "4.2.0-alpha.1",
-        "babylonjs-gltf2interface": "4.2.0-alpha.1"
+        "babylonjs": "4.2.0-alpha.2",
+        "babylonjs-gltf2interface": "4.2.0-alpha.2"
     },
     },
     "engines": {
     "engines": {
         "node": "*"
         "node": "*"

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

@@ -21149,6 +21149,10 @@ declare module "babylonjs/Materials/Textures/renderTargetTexture" {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -26809,8 +26813,59 @@ declare module "babylonjs/Meshes/Builders/discBuilder" {
     }
     }
 }
 }
 declare module "babylonjs/Materials/fresnelParameters" {
 declare module "babylonjs/Materials/fresnelParameters" {
+    import { DeepImmutable } from "babylonjs/types";
     import { Color3 } from "babylonjs/Maths/math.color";
     import { Color3 } from "babylonjs/Maths/math.color";
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -26838,21 +26893,33 @@ declare module "babylonjs/Materials/fresnelParameters" {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module "babylonjs/Materials/pushMaterial" {
 declare module "babylonjs/Materials/pushMaterial" {
@@ -28701,6 +28768,7 @@ declare module "babylonjs/Collisions/meshCollisionData" {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -29047,6 +29115,17 @@ declare module "babylonjs/Meshes/abstractMesh" {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -40750,6 +40829,7 @@ declare module "babylonjs/Behaviors/Meshes/sixDofDragBehavior" {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -50715,8 +50795,9 @@ declare module "babylonjs/Gizmos/boundingBoxGizmo" {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -56975,6 +57056,10 @@ declare module "babylonjs/Lights/Shadows/cascadedShadowGenerator" {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -60114,6 +60199,11 @@ declare module "babylonjs/Materials/Node/nodeMaterial" {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -64280,6 +64370,9 @@ declare module "babylonjs/Meshes/meshBuilder" {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -65347,6 +65440,16 @@ declare module "babylonjs/Navigation/INavigationEngine" {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -65653,6 +65756,16 @@ declare module "babylonjs/Navigation/Plugins/recastJSPlugin" {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -94190,6 +94303,10 @@ declare module BABYLON {
          */
          */
         activeCamera: Nullable<Camera>;
         activeCamera: Nullable<Camera>;
         /**
         /**
+         * Override the mesh isReady function with your own one.
+         */
+        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+        /**
          * Override the render function of the texture with your own one.
          * Override the render function of the texture with your own one.
          */
          */
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
         customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -99719,6 +99836,56 @@ declare module BABYLON {
 }
 }
 declare module BABYLON {
 declare module BABYLON {
     /**
     /**
+     * Options to be used when creating a FresnelParameters.
+     */
+    export type IFresnelParametersCreationOptions = {
+        /**
+         * Define the color used on edges (grazing angle)
+         */
+        leftColor?: Color3;
+        /**
+         * Define the color used on center
+         */
+        rightColor?: Color3;
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias?: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled?: boolean;
+    };
+    /**
+     * Serialized format for FresnelParameters.
+     */
+    export type IFresnelParametersSerialized = {
+        /**
+         * Define the color used on edges (grazing angle) [as an array]
+         */
+        leftColor: number[];
+        /**
+         * Define the color used on center [as an array]
+         */
+        rightColor: number[];
+        /**
+         * Define bias applied to computed fresnel term
+         */
+        bias: number;
+        /**
+         * Defined the power exponent applied to fresnel term
+         */
+        power?: number;
+        /**
+         * Define if the fresnel effect is enable or not.
+         */
+        isEnabled: boolean;
+    };
+    /**
      * This represents all the required information to add a fresnel effect on a material:
      * This represents all the required information to add a fresnel effect on a material:
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
      */
      */
@@ -99746,21 +99913,33 @@ declare module BABYLON {
          */
          */
         power: number;
         power: number;
         /**
         /**
+         * Creates a new FresnelParameters object.
+         *
+         * @param options provide your own settings to optionally to override defaults
+         */
+        constructor(options?: IFresnelParametersCreationOptions);
+        /**
          * Clones the current fresnel and its valuues
          * Clones the current fresnel and its valuues
          * @returns a clone fresnel configuration
          * @returns a clone fresnel configuration
          */
          */
         clone(): FresnelParameters;
         clone(): FresnelParameters;
         /**
         /**
+         * Determines equality between FresnelParameters objects
+         * @param otherFresnelParameters defines the second operand
+         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+         */
+        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
+        /**
          * Serializes the current fresnel parameters to a JSON representation.
          * Serializes the current fresnel parameters to a JSON representation.
          * @return the JSON serialization
          * @return the JSON serialization
          */
          */
-        serialize(): any;
+        serialize(): IFresnelParametersSerialized;
         /**
         /**
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * Parse a JSON object and deserialize it to a new Fresnel parameter object.
          * @param parsedFresnelParameters Define the JSON representation
          * @param parsedFresnelParameters Define the JSON representation
          * @returns the parsed parameters
          * @returns the parsed parameters
          */
          */
-        static Parse(parsedFresnelParameters: any): FresnelParameters;
+        static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
     }
     }
 }
 }
 declare module BABYLON {
 declare module BABYLON {
@@ -101519,6 +101698,7 @@ declare module BABYLON {
         _checkCollisions: boolean;
         _checkCollisions: boolean;
         _collisionMask: number;
         _collisionMask: number;
         _collisionGroup: number;
         _collisionGroup: number;
+        _surroundingMeshes: Nullable<AbstractMesh[]>;
         _collider: Nullable<Collider>;
         _collider: Nullable<Collider>;
         _oldPositionForCollisions: Vector3;
         _oldPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
         _diffPositionForCollisions: Vector3;
@@ -101841,6 +102021,17 @@ declare module BABYLON {
         get collisionGroup(): number;
         get collisionGroup(): number;
         set collisionGroup(mask: number);
         set collisionGroup(mask: number);
         /**
         /**
+         * Gets or sets current surrounding meshes (null by default).
+         *
+         * By default collision detection is tested against every mesh in the scene.
+         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+         * meshes will be tested for the collision.
+         *
+         * Note: if set to an empty array no collision will happen when this mesh is moved.
+         */
+        get surroundingMeshes(): Nullable<AbstractMesh[]>;
+        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
+        /**
          * Defines edge width used when edgesRenderer is enabled
          * Defines edge width used when edgesRenderer is enabled
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          * @see https://www.babylonjs-playground.com/#10OJSG#13
          */
          */
@@ -113184,6 +113375,7 @@ declare module BABYLON {
         private _pointerObserver;
         private _pointerObserver;
         private _moving;
         private _moving;
         private _startingOrientation;
         private _startingOrientation;
+        private _attachedElement;
         /**
         /**
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
          */
          */
@@ -122416,8 +122608,9 @@ declare module BABYLON {
         /**
         /**
          * Enables/disables scaling
          * Enables/disables scaling
          * @param enable if scaling should be enabled
          * @param enable if scaling should be enabled
+         * @param homogeneousScaling defines if scaling should only be homogeneous
          */
          */
-        setEnabledScaling(enable: boolean): void;
+        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
         private _updateDummy;
         private _updateDummy;
         /**
         /**
          * Enables a pointer drag behavior on the bounding box of the gizmo
          * Enables a pointer drag behavior on the bounding box of the gizmo
@@ -128230,6 +128423,10 @@ declare module BABYLON {
         private _computeMatrices;
         private _computeMatrices;
         private _computeFrustumInWorldSpace;
         private _computeFrustumInWorldSpace;
         private _computeCascadeFrustum;
         private _computeCascadeFrustum;
+        /**
+        *  Support test.
+        */
+        static get IsSupported(): boolean;
         /** @hidden */
         /** @hidden */
         static _SceneComponentInitialization: (scene: Scene) => void;
         static _SceneComponentInitialization: (scene: Scene) => void;
         /**
         /**
@@ -131128,6 +131325,11 @@ declare module BABYLON {
          */
          */
         loadFromSerialization(source: any, rootUrl?: string): void;
         loadFromSerialization(source: any, rootUrl?: string): void;
         /**
         /**
+         * Makes a duplicate of the current material.
+         * @param name - name to use for the new material.
+         */
+        clone(name: string): NodeMaterial;
+        /**
          * Creates a node material from parsed material data
          * Creates a node material from parsed material data
          * @param source defines the JSON representation of the material
          * @param source defines the JSON representation of the material
          * @param scene defines the hosting scene
          * @param scene defines the hosting scene
@@ -134838,6 +135040,9 @@ declare module BABYLON {
             sideOrientation?: number;
             sideOrientation?: number;
             frontUVs?: Vector4;
             frontUVs?: Vector4;
             backUVs?: Vector4;
             backUVs?: Vector4;
+            wrap?: boolean;
+            topBaseAt?: number;
+            bottomBaseAt?: number;
             updatable?: boolean;
             updatable?: boolean;
         }, scene?: Nullable<Scene>): Mesh;
         }, scene?: Nullable<Scene>): Mesh;
         /**
         /**
@@ -135844,6 +136049,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */
@@ -136145,6 +136360,16 @@ declare module BABYLON {
          */
          */
         getDefaultQueryExtent(): Vector3;
         getDefaultQueryExtent(): Vector3;
         /**
         /**
+         * build the navmesh from a previously saved state using getNavmeshData
+         * @param data the Uint8Array returned by getNavmeshData
+         */
+        buildFromNavmeshData(data: Uint8Array): void;
+        /**
+         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+         * @returns data the Uint8Array that can be saved and reused
+         */
+        getNavmeshData(): Uint8Array;
+        /**
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * Get the Bounding box extent result specified by setDefaultQueryExtent
          * @param result output the box extent values
          * @param result output the box extent values
          */
          */

File diff suppressed because it is too large
+ 23 - 23
dist/preview release/viewer/babylon.viewer.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/viewer/babylon.viewer.max.js


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

@@ -12,6 +12,7 @@
 - Scale on one axis for `BoundingBoxGizmo` ([cedricguillemet](https://github.com/cedricguillemet))
 - Scale on one axis for `BoundingBoxGizmo` ([cedricguillemet](https://github.com/cedricguillemet))
 
 
 - Simplified code contributions by fully automating the dev setup with gitpod ([nisarhassan12](https://github.com/nisarhassan12))
 - Simplified code contributions by fully automating the dev setup with gitpod ([nisarhassan12](https://github.com/nisarhassan12))
+- Add a `CascadedShadowMap.IsSupported` method and log an error instead of throwing an exception when CSM is not supported ([Popov72](https://github.com/Popov72))
 
 
 ### Engine
 ### Engine
 
 
@@ -36,17 +37,24 @@
 
 
 - Added support for glTF mesh instancing extension ([#7521](https://github.com/BabylonJS/Babylon.js/issues/7521)) ([drigax](https://github.com/Drigax))
 - Added support for glTF mesh instancing extension ([#7521](https://github.com/BabylonJS/Babylon.js/issues/7521)) ([drigax](https://github.com/Drigax))
 
 
+### Navigation
+- export/load prebuilt binary navigation mesh ([cedricguillemet](https://github.com/cedricguillemet))
+
 ### Materials
 ### Materials
 
 
 - Added the `roughness` and `albedoScaling` parameters to PBR sheen ([Popov72](https://github.com/Popov72))
 - Added the `roughness` and `albedoScaling` parameters to PBR sheen ([Popov72](https://github.com/Popov72))
 - Updated the energy conservation factor for the clear coat layer in PBR materials ([Popov72](https://github.com/Popov72))
 - Updated the energy conservation factor for the clear coat layer in PBR materials ([Popov72](https://github.com/Popov72))
 - Added the `transparencyMode` property to the `StandardMaterial` class ([Popov72](https://github.com/Popov72))
 - Added the `transparencyMode` property to the `StandardMaterial` class ([Popov72](https://github.com/Popov72))
+- Added to `FresnelParameters` constructor options and equals method ([brianzinn](https://github.com/brianzinn))
 
 
 ### WebXR
 ### WebXR
 
 
 - Added optional ray and mesh selection predicates to `WebXRControllerPointerSelection` ([Exolun](https://github.com/Exolun))
 - 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))
 - Implemented the new WebXR HitTest API ([#7364](https://github.com/BabylonJS/Babylon.js/issues/7364)) ([RaananW](https://github.com/RaananW))
 
 
+### Collisions
+- Added an option to optimize collision detection performance ([jsdream](https://github.com/jsdream)) - [PR](https://github.com/BabylonJS/Babylon.js/pull/7810)
+
 ## Bugs
 ## Bugs
 
 
 - Fix infinite loop in `GlowLayer.unReferenceMeshFromUsingItsOwnMaterial` ([Popov72](https://github.com/Popov72)
 - Fix infinite loop in `GlowLayer.unReferenceMeshFromUsingItsOwnMaterial` ([Popov72](https://github.com/Popov72)
@@ -59,5 +67,8 @@
 - Fix improper baking of transformed textures in `KHR_texture_transform` serializer. ([drigax](https://github.com/Drigax))
 - Fix improper baking of transformed textures in `KHR_texture_transform` serializer. ([drigax](https://github.com/Drigax))
 - Fixed NME codegen: missing common properties for float-value input block. ([ycw](https://github.com/ycw))
 - Fixed NME codegen: missing common properties for float-value input block. ([ycw](https://github.com/ycw))
 - Fixed missing options for MeshBuilder.CreateBox. ([ycw](https://github.com/ycw))
 - Fixed missing options for MeshBuilder.CreateBox. ([ycw](https://github.com/ycw))
+- Fix bug in `Plane.transform` when matrix passed in is not a pure rotation ([Popov72](https://github.com/Popov72)
+- Fix bug in PBR when anisotropy is enabled and no bump texture is provided ([Popov72](https://github.com/Popov72)
+- Fix horizon occlusion in PBR materials ([Popov72](https://github.com/Popov72)
 
 
 ## Breaking changes
 ## Breaking changes

+ 1 - 1
dist/readme.md

@@ -4,7 +4,7 @@ Getting started? Play directly with the Babylon.js API using our [playground](ht
 
 
 [![npm version](https://badge.fury.io/js/babylonjs.svg)](https://badge.fury.io/js/babylonjs)
 [![npm version](https://badge.fury.io/js/babylonjs.svg)](https://badge.fury.io/js/babylonjs)
 [![Build Status](https://dev.azure.com/babylonjs/ContinousIntegration/_apis/build/status/CI?branchName=master)](https://dev.azure.com/babylonjs/ContinousIntegration/_build/latest?definitionId=1&branchName=master)
 [![Build Status](https://dev.azure.com/babylonjs/ContinousIntegration/_apis/build/status/CI?branchName=master)](https://dev.azure.com/babylonjs/ContinousIntegration/_build/latest?definitionId=1&branchName=master)
-[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/BabylonJS/Babylon.js.svg)](http://isitmaintained.com/project/BabylonJS/Babylon.js "Average time to resolve an issue")
+[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/BabylonJS/Babylon.js.svg)](https://isitmaintained.com/project/BabylonJS/Babylon.js "Average time to resolve an issue")
 [![Percentage of issues still open](https://isitmaintained.com/badge/open/babylonJS/babylon.js.svg)](https://isitmaintained.com/project/babylonJS/babylon.js "Percentage of issues still open")
 [![Percentage of issues still open](https://isitmaintained.com/badge/open/babylonJS/babylon.js.svg)](https://isitmaintained.com/project/babylonJS/babylon.js "Percentage of issues still open")
 [![Build Size](https://img.badgesize.io/BabylonJS/Babylon.js/master/dist/preview%20release/babylon.js.svg?compression=gzip)](https://img.badgesize.io/BabylonJS/Babylon.js/master/dist/preview%20release/babylon.js.svg?compression=gzip)
 [![Build Size](https://img.badgesize.io/BabylonJS/Babylon.js/master/dist/preview%20release/babylon.js.svg?compression=gzip)](https://img.badgesize.io/BabylonJS/Babylon.js/master/dist/preview%20release/babylon.js.svg?compression=gzip)
 [![Twitter](https://img.shields.io/twitter/follow/babylonjs.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=babylonjs)
 [![Twitter](https://img.shields.io/twitter/follow/babylonjs.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=babylonjs)

+ 4 - 4
gui/src/2D/advancedDynamicTexture.ts

@@ -555,19 +555,19 @@ export class AdvancedDynamicTexture extends DynamicTexture {
                 return;
                 return;
             }
             }
             var globalViewport = this._getGlobalViewport(scene);
             var globalViewport = this._getGlobalViewport(scene);
-            for (var control of this._linkedControls) {
+            for (let control of this._linkedControls) {
                 if (!control.isVisible) {
                 if (!control.isVisible) {
                     continue;
                     continue;
                 }
                 }
-                var mesh = control._linkedMesh;
+                let mesh = control._linkedMesh;
                 if (!mesh || mesh.isDisposed()) {
                 if (!mesh || mesh.isDisposed()) {
                     Tools.SetImmediate(() => {
                     Tools.SetImmediate(() => {
                         control.linkWithMesh(null);
                         control.linkWithMesh(null);
                     });
                     });
                     continue;
                     continue;
                 }
                 }
-                var position = mesh.getBoundingInfo ? mesh.getBoundingInfo().boundingSphere.center : (Vector3.ZeroReadOnly as Vector3);
-                var projectedPosition = Vector3.Project(position, mesh.getWorldMatrix(), scene.getTransformMatrix(), globalViewport);
+                let position = mesh.getBoundingInfo ? mesh.getBoundingInfo().boundingSphere.center : (Vector3.ZeroReadOnly as Vector3);
+                let projectedPosition = Vector3.Project(position, mesh.getWorldMatrix(), scene.getTransformMatrix(), globalViewport);
                 if (projectedPosition.z < 0 || projectedPosition.z > 1) {
                 if (projectedPosition.z < 0 || projectedPosition.z > 1) {
                     control.notRenderable = true;
                     control.notRenderable = true;
                     continue;
                     continue;

+ 1 - 1
package.json

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

+ 10 - 6
src/Behaviors/Meshes/sixDofDragBehavior.ts

@@ -22,6 +22,8 @@ export class SixDofDragBehavior implements Behavior<Mesh> {
     private _pointerObserver: Nullable<Observer<PointerInfo>>;
     private _pointerObserver: Nullable<Observer<PointerInfo>>;
     private _moving = false;
     private _moving = false;
     private _startingOrientation = new Quaternion();
     private _startingOrientation = new Quaternion();
+    private _attachedElement: Nullable<HTMLElement> = null;
+
     /**
     /**
      * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
      * How much faster the object should move when the controller is moving towards it. This is useful to bring objects that are far away from the user to them faster. Set this to 0 to avoid any speed increase. (Default: 3)
      */
      */
@@ -109,7 +111,6 @@ export class SixDofDragBehavior implements Behavior<Mesh> {
         var pickPredicate = (m: AbstractMesh) => {
         var pickPredicate = (m: AbstractMesh) => {
             return this._ownerNode == m || m.isDescendantOf(this._ownerNode);
             return this._ownerNode == m || m.isDescendantOf(this._ownerNode);
         };
         };
-        var attachedElement: Nullable<HTMLElement> = null;
         this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo, eventState) => {
         this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo, eventState) => {
             if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {
             if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {
                 if (!this.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.ray && pickPredicate(pointerInfo.pickInfo.pickedMesh)) {
                 if (!this.dragging && pointerInfo.pickInfo && pointerInfo.pickInfo.hit && pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.ray && pickPredicate(pointerInfo.pickInfo.pickedMesh)) {
@@ -146,16 +147,16 @@ export class SixDofDragBehavior implements Behavior<Mesh> {
                     // Detatch camera controls
                     // Detatch camera controls
                     if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) {
                     if (this.detachCameraControls && this._pointerCamera && !this._pointerCamera.leftCamera) {
                         if (this._pointerCamera.inputs.attachedElement) {
                         if (this._pointerCamera.inputs.attachedElement) {
-                            attachedElement = this._pointerCamera.inputs.attachedElement;
+                            this._attachedElement = this._pointerCamera.inputs.attachedElement;
                             this._pointerCamera.detachControl(this._pointerCamera.inputs.attachedElement);
                             this._pointerCamera.detachControl(this._pointerCamera.inputs.attachedElement);
                         } else {
                         } else {
-                            attachedElement = null;
+                            this._attachedElement = null;
                         }
                         }
                     }
                     }
                     PivotTools._RestorePivotPoint(pickedMesh);
                     PivotTools._RestorePivotPoint(pickedMesh);
                     this.onDragStartObservable.notifyObservers({});
                     this.onDragStartObservable.notifyObservers({});
                 }
                 }
-            } else if (pointerInfo.type == PointerEventTypes.POINTERUP) {
+            } else if (pointerInfo.type == PointerEventTypes.POINTERUP || pointerInfo.type == PointerEventTypes.POINTERDOUBLETAP) {
                 if (this.currentDraggingPointerID == (<PointerEvent>pointerInfo.event).pointerId) {
                 if (this.currentDraggingPointerID == (<PointerEvent>pointerInfo.event).pointerId) {
                     this.dragging = false;
                     this.dragging = false;
                     this._moving = false;
                     this._moving = false;
@@ -164,8 +165,8 @@ export class SixDofDragBehavior implements Behavior<Mesh> {
                     this._virtualOriginMesh.removeChild(this._virtualDragMesh);
                     this._virtualOriginMesh.removeChild(this._virtualDragMesh);
 
 
                     // Reattach camera controls
                     // Reattach camera controls
-                    if (this.detachCameraControls && attachedElement && this._pointerCamera && !this._pointerCamera.leftCamera) {
-                        this._pointerCamera.attachControl(attachedElement, true);
+                    if (this.detachCameraControls && this._attachedElement && this._pointerCamera && !this._pointerCamera.leftCamera) {
+                        this._pointerCamera.attachControl(this._attachedElement, true);
                     }
                     }
                     this.onDragEndObservable.notifyObservers({});
                     this.onDragEndObservable.notifyObservers({});
                 }
                 }
@@ -245,6 +246,9 @@ export class SixDofDragBehavior implements Behavior<Mesh> {
      */
      */
     public detach(): void {
     public detach(): void {
         if (this._scene) {
         if (this._scene) {
+            if (this.detachCameraControls && this._attachedElement && this._pointerCamera && !this._pointerCamera.leftCamera) {
+                this._pointerCamera.attachControl(this._attachedElement, true);
+            }
             this._scene.onPointerObservable.remove(this._pointerObserver);
             this._scene.onPointerObservable.remove(this._pointerObserver);
         }
         }
         if (this._ownerNode) {
         if (this._ownerNode) {

+ 3 - 0
src/Collisions/collider.ts

@@ -70,6 +70,9 @@ var getLowestRoot: (a: number, b: number, c: number, maxR: number) => { root: nu
 
 
 /** @hidden */
 /** @hidden */
 export class Collider {
 export class Collider {
+    // Implementation of the "Improved Collision detection and Response" algorithm proposed by Kasper Fauerby
+    // https://www.peroxide.dk/papers/collision/collision.pdf
+
     /** Define if a collision was found */
     /** Define if a collision was found */
     public collisionFound: boolean;
     public collisionFound: boolean;
 
 

+ 6 - 3
src/Collisions/collisionCoordinator.ts

@@ -57,9 +57,12 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator {
 
 
         collider._initialize(position, velocity, closeDistance);
         collider._initialize(position, velocity, closeDistance);
 
 
-        // Check all meshes
-        for (var index = 0; index < this._scene.meshes.length; index++) {
-            var mesh = this._scene.meshes[index];
+        // Check if collision detection should happen against specified list of meshes or,
+        // if not specified, against all meshes in the scene
+        var meshes = (excludedMesh && excludedMesh.surroundingMeshes) || this._scene.meshes;
+
+        for (var index = 0; index < meshes.length; index++) {
+            var mesh = meshes[index];
             if (mesh.isEnabled() && mesh.checkCollisions && mesh.subMeshes && mesh !== excludedMesh && ((collisionMask & mesh.collisionGroup) !== 0)) {
             if (mesh.isEnabled() && mesh.checkCollisions && mesh.subMeshes && mesh !== excludedMesh && ((collisionMask & mesh.collisionGroup) !== 0)) {
                 mesh._checkCollision(collider);
                 mesh._checkCollision(collider);
             }
             }

+ 1 - 0
src/Collisions/meshCollisionData.ts

@@ -12,6 +12,7 @@ export class _MeshCollisionData {
     public _checkCollisions = false;
     public _checkCollisions = false;
     public _collisionMask = -1;
     public _collisionMask = -1;
     public _collisionGroup = -1;
     public _collisionGroup = -1;
+    public _surroundingMeshes: Nullable<AbstractMesh[]> = null;
     public _collider: Nullable<Collider> = null;
     public _collider: Nullable<Collider> = null;
     public _oldPositionForCollisions = new Vector3(0, 0, 0);
     public _oldPositionForCollisions = new Vector3(0, 0, 0);
     public _diffPositionForCollisions = new Vector3(0, 0, 0);
     public _diffPositionForCollisions = new Vector3(0, 0, 0);

+ 2 - 2
src/Engines/thinEngine.ts

@@ -132,14 +132,14 @@ export class ThinEngine {
      */
      */
     // Not mixed with Version for tooling purpose.
     // Not mixed with Version for tooling purpose.
     public static get NpmPackage(): string {
     public static get NpmPackage(): string {
-        return "babylonjs@4.2.0-alpha.1";
+        return "babylonjs@4.2.0-alpha.2";
     }
     }
 
 
     /**
     /**
      * Returns the current version of the framework
      * Returns the current version of the framework
      */
      */
     public static get Version(): string {
     public static get Version(): string {
-        return "4.2.0-alpha.1";
+        return "4.2.0-alpha.2";
     }
     }
 
 
     /**
     /**

+ 10 - 2
src/Gizmos/boundingBoxGizmo.ts

@@ -256,8 +256,10 @@ export class BoundingBoxGizmo extends Gizmo {
                     if (zeroAxisCount === 1 || zeroAxisCount === 3) {
                     if (zeroAxisCount === 1 || zeroAxisCount === 3) {
                         continue;
                         continue;
                     }
                     }
+
                     let box = BoxBuilder.CreateBox("", { size: 1 }, gizmoLayer.utilityLayerScene);
                     let box = BoxBuilder.CreateBox("", { size: 1 }, gizmoLayer.utilityLayerScene);
                     box.material = this.coloredMaterial;
                     box.material = this.coloredMaterial;
+                    box.metadata = zeroAxisCount === 2; // None homogenous scale handle
 
 
                     // Dragging logic
                     // Dragging logic
                     let dragAxis = new Vector3(i - 1, j - 1, k - 1);
                     let dragAxis = new Vector3(i - 1, j - 1, k - 1);
@@ -542,10 +544,16 @@ export class BoundingBoxGizmo extends Gizmo {
     /**
     /**
      * Enables/disables scaling
      * Enables/disables scaling
      * @param enable if scaling should be enabled
      * @param enable if scaling should be enabled
+     * @param homogeneousScaling defines if scaling should only be homogeneous
      */
      */
-    public setEnabledScaling(enable: boolean) {
+    public setEnabledScaling(enable: boolean, homogeneousScaling = false) {
         this._scaleBoxesParent.getChildMeshes().forEach((m, i) => {
         this._scaleBoxesParent.getChildMeshes().forEach((m, i) => {
-            m.setEnabled(enable);
+            let enableMesh = enable;
+            // Disable heterogenous scale handles if requested.
+            if (homogeneousScaling && m.metadata === true) {
+                enableMesh = false;
+            }
+            m.setEnabled(enableMesh);
         });
         });
     }
     }
 
 

+ 17 - 2
src/Lights/Shadows/cascadedShadowGenerator.ts

@@ -21,6 +21,9 @@ import { BoundingInfo } from '../../Culling/boundingInfo';
 import { DepthRenderer } from '../../Rendering/depthRenderer';
 import { DepthRenderer } from '../../Rendering/depthRenderer';
 import { DepthReducer } from '../../Misc/depthReducer';
 import { DepthReducer } from '../../Misc/depthReducer';
 
 
+import { Logger } from "../../Misc/logger";
+import { EngineStore } from '../../Engines/engineStore';
+
 interface ICascade {
 interface ICascade {
     prevBreakDistance: number;
     prevBreakDistance: number;
     breakDistance: number;
     breakDistance: number;
@@ -684,6 +687,17 @@ export class CascadedShadowGenerator extends ShadowGenerator {
         }
         }
     }
     }
 
 
+    /**
+    *  Support test.
+    */
+    public static get IsSupported(): boolean {
+        var engine = EngineStore.LastCreatedEngine;
+        if (!engine) {
+            return false;
+        }
+        return engine.webGLVersion != 1;
+    }
+
     /** @hidden */
     /** @hidden */
     public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {
     public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {
         throw _DevTools.WarnImport("ShadowGeneratorSceneComponent");
         throw _DevTools.WarnImport("ShadowGeneratorSceneComponent");
@@ -701,8 +715,9 @@ export class CascadedShadowGenerator extends ShadowGenerator {
     constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean) {
     constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean) {
         super(mapSize, light, usefulFloatFirst);
         super(mapSize, light, usefulFloatFirst);
 
 
-        if (this._scene.getEngine().webGLVersion == 1) {
-            throw "CSM can only be used in WebGL2";
+        if (!CascadedShadowGenerator.IsSupported) {
+            Logger.Error("CascadedShadowMap needs WebGL 2 support.");
+            return;
         }
         }
 
 
         this.usePercentageCloserFiltering = true;
         this.usePercentageCloserFiltering = true;

+ 7 - 0
src/Lights/Shadows/shadowGenerator.ts

@@ -870,6 +870,13 @@ export class ShadowGenerator implements IShadowGenerator {
         // Custom render function.
         // Custom render function.
         this._shadowMap.customRenderFunction = this._renderForShadowMap.bind(this);
         this._shadowMap.customRenderFunction = this._renderForShadowMap.bind(this);
 
 
+        // Force the mesh is ready funcion to true as we are double checking it
+        // in the custom render function. Also it prevents side effects and useless
+        // shader variations in DEPTHPREPASS mode.
+        this._shadowMap.customIsReadyFunction = (m: AbstractMesh, r: number) => {
+            return true;
+        };
+
         let engine = this._scene.getEngine();
         let engine = this._scene.getEngine();
 
 
         // Record Face Index before render.
         // Record Face Index before render.

+ 0 - 32
src/Loading/Plugins/babylonFileLoader.ts

@@ -748,38 +748,6 @@ SceneLoader.RegisterPlugin({
                 scene.setActiveCameraByID(parsedData.activeCameraID);
                 scene.setActiveCameraByID(parsedData.activeCameraID);
             }
             }
 
 
-            // Environment texture
-            if (parsedData.environmentTexture !== undefined && parsedData.environmentTexture !== null) {
-                // PBR needed for both HDR texture (gamma space) & a sky box
-                var isPBR = parsedData.isPBR !== undefined ? parsedData.isPBR : true;
-                if (parsedData.environmentTextureType && parsedData.environmentTextureType === "BABYLON.HDRCubeTexture") {
-                    var hdrSize: number = (parsedData.environmentTextureSize) ? parsedData.environmentTextureSize : 128;
-                    var hdrTexture = new HDRCubeTexture(rootUrl + parsedData.environmentTexture, scene, hdrSize, true, !isPBR);
-                    if (parsedData.environmentTextureRotationY) {
-                        hdrTexture.rotationY = parsedData.environmentTextureRotationY;
-                    }
-                    scene.environmentTexture = hdrTexture;
-                } else {
-                    if (StringTools.EndsWith(parsedData.environmentTexture, ".env")) {
-                        var compressedTexture = new CubeTexture(rootUrl + parsedData.environmentTexture, scene);
-                        if (parsedData.environmentTextureRotationY) {
-                            compressedTexture.rotationY = parsedData.environmentTextureRotationY;
-                        }
-                        scene.environmentTexture = compressedTexture;
-                    } else {
-                        var cubeTexture = CubeTexture.CreateFromPrefilteredData(rootUrl + parsedData.environmentTexture, scene);
-                        if (parsedData.environmentTextureRotationY) {
-                            cubeTexture.rotationY = parsedData.environmentTextureRotationY;
-                        }
-                        scene.environmentTexture = cubeTexture;
-                    }
-                }
-                if (parsedData.createDefaultSkybox === true) {
-                    var skyboxScale = (scene.activeCamera !== undefined && scene.activeCamera !== null) ? (scene.activeCamera.maxZ - scene.activeCamera.minZ) / 2 : 1000;
-                    var skyboxBlurLevel = parsedData.skyboxBlurLevel || 0;
-                    scene.createDefaultSkybox(scene.environmentTexture, isPBR, skyboxScale, skyboxBlurLevel);
-                }
-            }
             // Finish
             // Finish
             return true;
             return true;
         } catch (err) {
         } catch (err) {

+ 17 - 0
src/Materials/Node/nodeMaterial.ts

@@ -1285,6 +1285,23 @@ export class NodeMaterial extends PushMaterial {
     }
     }
 
 
     /**
     /**
+     * Makes a duplicate of the current material.
+     * @param name - name to use for the new material.
+     */
+    public clone(name: string): NodeMaterial {
+        const serializationObject = this.serialize();
+
+        const clone = SerializationHelper.Clone(() => new NodeMaterial(name, this.getScene(), this.options), this);
+        clone.id = name;
+        clone.name = name;
+
+        clone.loadFromSerialization(serializationObject);
+        clone.build();
+
+        return clone;
+    }
+
+    /**
      * Creates a node material from parsed material data
      * Creates a node material from parsed material data
      * @param source defines the JSON representation of the material
      * @param source defines the JSON representation of the material
      * @param scene defines the hosting scene
      * @param scene defines the hosting scene

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

@@ -121,6 +121,10 @@ export class RenderTargetTexture extends Texture {
      */
      */
     public activeCamera: Nullable<Camera>;
     public activeCamera: Nullable<Camera>;
     /**
     /**
+     * Override the mesh isReady function with your own one.
+     */
+    public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number) => boolean;
+    /**
      * Override the render function of the texture with your own one.
      * Override the render function of the texture with your own one.
      */
      */
     public customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
     public customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
@@ -745,7 +749,13 @@ export class RenderTargetTexture extends Texture {
             var mesh = currentRenderList[meshIndex];
             var mesh = currentRenderList[meshIndex];
 
 
             if (mesh) {
             if (mesh) {
-                if (!mesh.isReady(this.refreshRate === 0)) {
+                if (this.customIsReadyFunction) {
+                    if (!this.customIsReadyFunction(mesh, this.refreshRate)) {
+                        this.resetRefreshCounter();
+                        continue;
+                    }
+                }
+                else if (!mesh.isReady(this.refreshRate === 0)) {
                     this.resetRefreshCounter();
                     this.resetRefreshCounter();
                     continue;
                     continue;
                 }
                 }

+ 2 - 1
src/Materials/effectRenderer.ts

@@ -164,12 +164,13 @@ export class EffectRenderer {
 
 
             // Reset state
             // Reset state
             this.setViewport();
             this.setViewport();
-            this.applyEffectWrapper(effectWrapper);
 
 
             if (renderTo) {
             if (renderTo) {
                 this.engine.bindFramebuffer(renderTo.getInternalTexture()!);
                 this.engine.bindFramebuffer(renderTo.getInternalTexture()!);
             }
             }
 
 
+            this.applyEffectWrapper(effectWrapper);
+
             this.draw();
             this.draw();
 
 
             if (renderTo) {
             if (renderTo) {

+ 110 - 24
src/Materials/fresnelParameters.ts

@@ -1,10 +1,71 @@
 import { DeepCopier } from "../Misc/deepCopier";
 import { DeepCopier } from "../Misc/deepCopier";
+import { DeepImmutable } from '../types';
 import { Color3 } from "../Maths/math.color";
 import { Color3 } from "../Maths/math.color";
 import { Engine } from "../Engines/engine";
 import { Engine } from "../Engines/engine";
 import { SerializationHelper } from "../Misc/decorators";
 import { SerializationHelper } from "../Misc/decorators";
 import { Constants } from "../Engines/constants";
 import { Constants } from "../Engines/constants";
 
 
 /**
 /**
+ * Options to be used when creating a FresnelParameters.
+ */
+export type IFresnelParametersCreationOptions = {
+    /**
+     * Define the color used on edges (grazing angle)
+     */
+    leftColor?: Color3;
+
+    /**
+     * Define the color used on center
+     */
+    rightColor?: Color3;
+
+    /**
+     * Define bias applied to computed fresnel term
+     */
+    bias?: number;
+
+    /**
+     * Defined the power exponent applied to fresnel term
+     */
+    power?: number;
+
+    /**
+     * Define if the fresnel effect is enable or not.
+     */
+    isEnabled?: boolean;
+};
+
+/**
+ * Serialized format for FresnelParameters.
+ */
+export type IFresnelParametersSerialized = {
+    /**
+     * Define the color used on edges (grazing angle) [as an array]
+     */
+    leftColor: number[];
+
+    /**
+     * Define the color used on center [as an array]
+     */
+    rightColor: number[];
+
+    /**
+     * Define bias applied to computed fresnel term
+     */
+    bias: number;
+
+    /**
+     * Defined the power exponent applied to fresnel term
+     */
+    power?: number;
+
+    /**
+     * Define if the fresnel effect is enable or not.
+     */
+    isEnabled: boolean;
+};
+
+/**
  * This represents all the required information to add a fresnel effect on a material:
  * This represents all the required information to add a fresnel effect on a material:
  * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
  * @see http://doc.babylonjs.com/how_to/how_to_use_fresnelparameters
  */
  */
@@ -28,22 +89,37 @@ export class FresnelParameters {
     /**
     /**
      * Define the color used on edges (grazing angle)
      * Define the color used on edges (grazing angle)
      */
      */
-    public leftColor = Color3.White();
+    public leftColor: Color3;
 
 
     /**
     /**
      * Define the color used on center
      * Define the color used on center
      */
      */
-    public rightColor = Color3.Black();
+    public rightColor: Color3;
 
 
     /**
     /**
      * Define bias applied to computed fresnel term
      * Define bias applied to computed fresnel term
      */
      */
-    public bias = 0;
+    public bias: number;
 
 
     /**
     /**
      * Defined the power exponent applied to fresnel term
      * Defined the power exponent applied to fresnel term
      */
      */
-    public power = 1;
+    public power: number;
+
+    /**
+     * Creates a new FresnelParameters object.
+     *
+     * @param options provide your own settings to optionally to override defaults
+     */
+    public constructor(options: IFresnelParametersCreationOptions = {}) {
+        this.bias = (options.bias === undefined) ? 0 : options.bias;
+        this.power = (options.power === undefined) ? 1 : options.power;
+        this.leftColor = options.leftColor || Color3.White();
+        this.rightColor = options.rightColor || Color3.Black();
+        if (options.isEnabled === false) {
+            this.isEnabled = false;
+        }
+    }
 
 
     /**
     /**
      * Clones the current fresnel and its valuues
      * Clones the current fresnel and its valuues
@@ -58,19 +134,31 @@ export class FresnelParameters {
     }
     }
 
 
     /**
     /**
+     * Determines equality between FresnelParameters objects
+     * @param otherFresnelParameters defines the second operand
+     * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
+     */
+    public equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean {
+        return otherFresnelParameters &&
+            this.bias === otherFresnelParameters.bias &&
+            this.power === otherFresnelParameters.power &&
+            this.leftColor.equals(otherFresnelParameters.leftColor) &&
+            this.rightColor.equals(otherFresnelParameters.rightColor) &&
+            this.isEnabled === otherFresnelParameters.isEnabled;
+    }
+
+    /**
      * Serializes the current fresnel parameters to a JSON representation.
      * Serializes the current fresnel parameters to a JSON representation.
      * @return the JSON serialization
      * @return the JSON serialization
      */
      */
-    public serialize(): any {
-        var serializationObject: any = {};
-
-        serializationObject.isEnabled = this.isEnabled;
-        serializationObject.leftColor = this.leftColor.asArray();
-        serializationObject.rightColor = this.rightColor.asArray();
-        serializationObject.bias = this.bias;
-        serializationObject.power = this.power;
-
-        return serializationObject;
+    public serialize(): IFresnelParametersSerialized {
+        return {
+            isEnabled: this.isEnabled,
+            leftColor: this.leftColor.asArray(),
+            rightColor: this.rightColor.asArray(),
+            bias: this.bias,
+            power: this.power
+        };
     }
     }
 
 
     /**
     /**
@@ -78,16 +166,14 @@ export class FresnelParameters {
      * @param parsedFresnelParameters Define the JSON representation
      * @param parsedFresnelParameters Define the JSON representation
      * @returns the parsed parameters
      * @returns the parsed parameters
      */
      */
-    public static Parse(parsedFresnelParameters: any): FresnelParameters {
-        var fresnelParameters = new FresnelParameters();
-
-        fresnelParameters.isEnabled = parsedFresnelParameters.isEnabled;
-        fresnelParameters.leftColor = Color3.FromArray(parsedFresnelParameters.leftColor);
-        fresnelParameters.rightColor = Color3.FromArray(parsedFresnelParameters.rightColor);
-        fresnelParameters.bias = parsedFresnelParameters.bias;
-        fresnelParameters.power = parsedFresnelParameters.power || 1.0;
-
-        return fresnelParameters;
+    public static Parse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters {
+        return new FresnelParameters({
+            isEnabled: parsedFresnelParameters.isEnabled,
+            leftColor: Color3.FromArray(parsedFresnelParameters.leftColor),
+            rightColor: Color3.FromArray(parsedFresnelParameters.rightColor),
+            bias: parsedFresnelParameters.bias,
+            power: parsedFresnelParameters.power || 1.0
+        });
     }
     }
 }
 }
 
 

+ 3 - 3
src/Maths/math.plane.ts

@@ -78,9 +78,9 @@ export class Plane {
      * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.
      * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.
      */
      */
     public transform(transformation: DeepImmutable<Matrix>): Plane {
     public transform(transformation: DeepImmutable<Matrix>): Plane {
-        const transposedMatrix = Plane._TmpMatrix;
-        Matrix.TransposeToRef(transformation, transposedMatrix);
-        const m = transposedMatrix.m;
+        const invertedMatrix = Plane._TmpMatrix;
+        transformation.invertToRef(invertedMatrix);
+        const m = invertedMatrix.m;
         var x = this.normal.x;
         var x = this.normal.x;
         var y = this.normal.y;
         var y = this.normal.y;
         var z = this.normal.z;
         var z = this.normal.z;

+ 17 - 0
src/Meshes/abstractMesh.ts

@@ -559,6 +559,23 @@ export class AbstractMesh extends TransformNode implements IDisposable, ICullabl
         this._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;
         this._meshCollisionData._collisionGroup = !isNaN(mask) ? mask : -1;
     }
     }
 
 
+    /**
+     * Gets or sets current surrounding meshes (null by default).
+     *
+     * By default collision detection is tested against every mesh in the scene.
+     * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
+     * meshes will be tested for the collision.
+     *
+     * Note: if set to an empty array no collision will happen when this mesh is moved.
+     */
+    public get surroundingMeshes(): Nullable<AbstractMesh[]> {
+        return this._meshCollisionData._surroundingMeshes;
+    }
+
+    public set surroundingMeshes(meshes: Nullable<AbstractMesh[]>) {
+        this._meshCollisionData._surroundingMeshes = meshes;
+    }
+
     // Edges
     // Edges
     /**
     /**
      * Defines edge width used when edgesRenderer is enabled
      * Defines edge width used when edgesRenderer is enabled

+ 2 - 2
src/Meshes/transformNode.ts

@@ -1238,7 +1238,7 @@ export class TransformNode extends Node {
             camera = (<Camera>this.getScene().activeCamera);
             camera = (<Camera>this.getScene().activeCamera);
         }
         }
 
 
-        return Vector3.TransformCoordinates(this.absolutePosition, camera.getViewMatrix());
+        return Vector3.TransformCoordinates(this.getAbsolutePosition(), camera.getViewMatrix());
     }
     }
 
 
     /**
     /**
@@ -1250,7 +1250,7 @@ export class TransformNode extends Node {
         if (!camera) {
         if (!camera) {
             camera = (<Camera>this.getScene().activeCamera);
             camera = (<Camera>this.getScene().activeCamera);
         }
         }
-        return this.absolutePosition.subtract(camera.globalPosition).length();
+        return this.getAbsolutePosition().subtract(camera.globalPosition).length();
     }
     }
 
 
     /**
     /**

+ 12 - 0
src/Navigation/INavigationEngine.ts

@@ -110,6 +110,18 @@ export interface INavigationEnginePlugin {
     getDefaultQueryExtent(): Vector3;
     getDefaultQueryExtent(): Vector3;
 
 
     /**
     /**
+     * build the navmesh from a previously saved state using getNavmeshData
+     * @param data the Uint8Array returned by getNavmeshData
+     */
+    buildFromNavmeshData(data: Uint8Array): void;
+
+    /**
+     * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+     * @returns data the Uint8Array that can be saved and reused
+     */
+    getNavmeshData(): Uint8Array;
+
+    /**
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * @param result output the box extent values
      * @param result output the box extent values
      */
      */

+ 36 - 0
src/Navigation/Plugins/recastJSPlugin.ts

@@ -282,6 +282,42 @@ export class RecastJSPlugin implements INavigationEnginePlugin {
     }
     }
 
 
     /**
     /**
+     * build the navmesh from a previously saved state using getNavmeshData
+     * @param data the Uint8Array returned by getNavmeshData
+     */
+    buildFromNavmeshData(data: Uint8Array): void
+    {
+        var nDataBytes = data.length * data.BYTES_PER_ELEMENT;
+        var dataPtr = this.bjsRECAST._malloc(nDataBytes);
+
+        var dataHeap = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, dataPtr, nDataBytes);
+        dataHeap.set(data);
+
+        let buf = new this.bjsRECAST.NavmeshData();
+        buf.dataPointer = dataHeap.byteOffset;
+        buf.size = data.length;
+        this.navMesh = new this.bjsRECAST.NavMesh();
+        this.navMesh.buildFromNavmeshData(buf);
+
+        // Free memory
+        this.bjsRECAST._free(dataHeap.byteOffset);
+    }
+
+    /**
+     * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
+     * @returns data the Uint8Array that can be saved and reused
+     */
+    getNavmeshData(): Uint8Array
+    {
+        let navmeshData = this.navMesh.getNavmeshData();
+        var arrView = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, navmeshData.dataPointer, navmeshData.size);
+        var ret = new Uint8Array(navmeshData.size);
+        ret.set(arrView);
+        this.navMesh.freeNavmeshData(navmeshData);
+        return ret;
+    }
+
+    /**
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * Get the Bounding box extent result specified by setDefaultQueryExtent
      * @param result output the box extent values
      * @param result output the box extent values
      */
      */

+ 1 - 1
src/Shaders/ShadersInclude/bumpVertex.fx

@@ -1,4 +1,4 @@
-#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP)
+#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
 	#if defined(TANGENT) && defined(NORMAL)
 	#if defined(TANGENT) && defined(NORMAL)
 		vec3 tbnNormal = normalize(normalUpdated);
 		vec3 tbnNormal = normalize(normalUpdated);
 		vec3 tbnTangent = normalize(tangentUpdated.xyz);
 		vec3 tbnTangent = normalize(tangentUpdated.xyz);

+ 1 - 1
src/Shaders/ShadersInclude/bumpVertexDeclaration.fx

@@ -1,4 +1,4 @@
-#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP)
+#if defined(BUMP) || defined(PARALLAX) || defined(CLEARCOAT_BUMP) || defined(ANISOTROPIC)
 	#if defined(TANGENT) && defined(NORMAL) 
 	#if defined(TANGENT) && defined(NORMAL) 
 		varying mat3 vTBN;
 		varying mat3 vTBN;
 	#endif
 	#endif

+ 2 - 2
src/Shaders/ShadersInclude/pbrIBLFunctions.fx

@@ -21,10 +21,10 @@
 #endif
 #endif
 
 
 #if defined(ENVIRONMENTBRDF) && defined(HORIZONOCCLUSION)
 #if defined(ENVIRONMENTBRDF) && defined(HORIZONOCCLUSION)
-    float environmentHorizonOcclusion(vec3 view, vec3 normal) {
+    float environmentHorizonOcclusion(vec3 view, vec3 normal, vec3 geometricNormal) {
         // http://marmosetco.tumblr.com/post/81245981087
         // http://marmosetco.tumblr.com/post/81245981087
         vec3 reflection = reflect(view, normal);
         vec3 reflection = reflect(view, normal);
-        float temp = saturate(1.0 + 1.1 * dot(reflection, normal));
+        float temp = saturate(1.0 + 1.1 * dot(reflection, geometricNormal));
         return square(temp);
         return square(temp);
     }
     }
 #endif
 #endif

+ 9 - 3
src/Shaders/pbr.fragment.fx

@@ -64,9 +64,15 @@ void main(void) {
     vec3 normalW = normalize(cross(dFdx(vPositionW), dFdy(vPositionW))) * vEyePosition.w;
     vec3 normalW = normalize(cross(dFdx(vPositionW), dFdy(vPositionW))) * vEyePosition.w;
 #endif
 #endif
 
 
+    vec3 geometricNormalW = normalW;
+
+#if defined(TWOSIDEDLIGHTING) && defined(NORMAL)
+    geometricNormalW = gl_FrontFacing ? geometricNormalW : -geometricNormalW;
+#endif
+
 #ifdef CLEARCOAT
 #ifdef CLEARCOAT
     // Needs to use the geometric normal before bump for this.
     // Needs to use the geometric normal before bump for this.
-    vec3 clearCoatNormalW = normalW;
+    vec3 clearCoatNormalW = geometricNormalW;
 #endif
 #endif
 
 
 #include<bumpFragment>
 #include<bumpFragment>
@@ -883,7 +889,7 @@ void main(void) {
         #ifdef HORIZONOCCLUSION
         #ifdef HORIZONOCCLUSION
             #ifdef BUMP
             #ifdef BUMP
                 #ifdef REFLECTIONMAP_3D
                 #ifdef REFLECTIONMAP_3D
-                    float eho = environmentHorizonOcclusion(-viewDirectionW, normalW);
+                    float eho = environmentHorizonOcclusion(-viewDirectionW, normalW, geometricNormalW);
                     specularEnvironmentReflectance *= eho;
                     specularEnvironmentReflectance *= eho;
                 #endif
                 #endif
             #endif
             #endif
@@ -941,7 +947,7 @@ void main(void) {
             #ifdef HORIZONOCCLUSION
             #ifdef HORIZONOCCLUSION
                 #ifdef BUMP
                 #ifdef BUMP
                     #ifdef REFLECTIONMAP_3D
                     #ifdef REFLECTIONMAP_3D
-                        float clearCoatEho = environmentHorizonOcclusion(-viewDirectionW, clearCoatNormalW);
+                        float clearCoatEho = environmentHorizonOcclusion(-viewDirectionW, clearCoatNormalW, geometricNormalW);
                         clearCoatEnvironmentReflectance *= clearCoatEho;
                         clearCoatEnvironmentReflectance *= clearCoatEho;
                     #endif
                     #endif
                 #endif
                 #endif

+ 94 - 0
tests/unit/babylon/src/Materials/babylon.fresnelParameters.tests.ts

@@ -0,0 +1,94 @@
+/**
+ * Test Suite for FresnelParameters.
+ */
+describe('Babylon Material FresnelParameters', () => {
+
+    /**
+     * Loads the dependencies.
+     */
+    before(function(done) {
+        this.timeout(180000);
+        (BABYLONDEVTOOLS).Loader
+            .useDist()
+            .testMode()
+            .load(function() {
+                // Force apply promise polyfill for consistent behavior between chrome headless, IE11, and other browsers.
+                BABYLON.PromisePolyfill.Apply(true);
+                done();
+            });
+    });
+
+    describe('#FresnelParameters', () => {
+        it('empty constructor has default values', () => {
+            const subject = new BABYLON.FresnelParameters();
+            expect(subject.bias).to.equal(0, 'bias default is 0');
+            expect(subject.power).to.equal(1, 'power default is 1');
+            expect(subject.isEnabled).to.be.true;
+            expect(subject.leftColor.equals(BABYLON.Color3.White())).to.be.true;
+            expect(subject.rightColor.equals(BABYLON.Color3.Black())).to.be.true;
+        });
+
+        it('serialized empty constructor is serialized correctly', () => {
+            const subject = new BABYLON.FresnelParameters().serialize();
+            console.error(subject)
+            expect(subject).deep.equals({
+                isEnabled: true,
+                leftColor: [1, 1, 1],
+                rightColor: [0, 0, 0],
+                bias: 0,
+                power: 1
+            })
+        });
+
+        it('new FresnelParameters({...}) with options specified', () => {
+            const subject = new BABYLON.FresnelParameters({
+                bias: 1,
+                power: 0,
+                isEnabled: false,
+                leftColor: BABYLON.Color3.Black(),
+                rightColor: BABYLON.Color3.White()
+            });
+            expect(subject.bias).to.equal(1, 'created with 1');
+            expect(subject.power).to.equal(0, 'created with 0');
+            expect(subject.isEnabled).to.be.false;
+            expect(subject.leftColor.equals(BABYLON.Color3.Black())).to.be.true;
+            expect(subject.rightColor.equals(BABYLON.Color3.White())).to.be.true;
+        });
+
+        it('FresnelParameters.Parse({...}) with equality check', () => {
+            const subject = BABYLON.FresnelParameters.Parse({
+                isEnabled: true,
+                leftColor: [1, 1, 1],
+                rightColor: [0, 0, 0],
+                bias: 0,
+                power: 1
+            })
+
+            expect(new BABYLON.FresnelParameters().equals(subject)).to.be.true;
+        });
+
+        it('disabling FresnelParameters should mark materials as dirty (not ready)', () => {
+            const engine = new BABYLON.NullEngine({
+                renderHeight: 256,
+                renderWidth: 256,
+                textureSize: 256,
+                deterministicLockstep: false,
+                lockstepMaxSteps: 1
+            });
+
+            const scene = new BABYLON.Scene(engine);
+            const mesh = BABYLON.Mesh.CreateBox("mesh", 1, scene);
+            const material = new BABYLON.StandardMaterial("material", scene);
+            mesh.material = material;
+
+            const subject = new BABYLON.FresnelParameters();
+            material.refractionFresnelParameters = subject;
+
+            expect(scene._cachedMaterial).is.not.null;
+
+            // should mark materials as dirty and clear scene cache
+            subject.isEnabled = false;
+            expect(scene._cachedMaterial).is.null;
+        });
+    });
+})

+ 2 - 1
tests/unit/karma.conf.js

@@ -19,7 +19,6 @@ module.exports = function(config) {
             '!./**/*.d.ts',
             '!./**/*.d.ts',
             './Tools/DevLoader/BabylonLoader.js',
             './Tools/DevLoader/BabylonLoader.js',
             './tests/unit/babylon/babylon.example.tests.js',
             './tests/unit/babylon/babylon.example.tests.js',
-            './tests/unit/babylon/src/Mesh/babylon.positionAndRotation.tests.js',
             './tests/unit/babylon/serializers/babylon.glTFSerializer.tests.js',
             './tests/unit/babylon/serializers/babylon.glTFSerializer.tests.js',
             './tests/unit/babylon/src/babylon.node.tests.js',
             './tests/unit/babylon/src/babylon.node.tests.js',
             './tests/unit/babylon/src/Animations/babylon.animation.tests.js',
             './tests/unit/babylon/src/Animations/babylon.animation.tests.js',
@@ -29,9 +28,11 @@ module.exports = function(config) {
             './tests/unit/babylon/src/Loading/babylon.sceneLoader.tests.js',
             './tests/unit/babylon/src/Loading/babylon.sceneLoader.tests.js',
             './tests/unit/babylon/src/PostProcesses/babylon.postProcess.tests.js',
             './tests/unit/babylon/src/PostProcesses/babylon.postProcess.tests.js',
             './tests/unit/babylon/src/Materials/babylon.material.tests.js',
             './tests/unit/babylon/src/Materials/babylon.material.tests.js',
+            './tests/unit/babylon/src/Materials/babylon.fresnelParameters.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.dictionaryMode.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.dictionaryMode.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.geometry.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.geometry.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.mesh.vertexData.tests.js',
             './tests/unit/babylon/src/Meshes/babylon.mesh.vertexData.tests.js',
+            './tests/unit/babylon/src/Meshes/babylon.positionAndRotation.tests.js',
             './tests/unit/babylon/src/Misc/babylon.promise.tests.js',
             './tests/unit/babylon/src/Misc/babylon.promise.tests.js',
             './tests/unit/babylon/src/Physics/babylon.physicsComponents.tests.js',
             './tests/unit/babylon/src/Physics/babylon.physicsComponents.tests.js',
             { pattern: 'dist/preview release/**/*.js', watched: false, included: false, served: true },
             { pattern: 'dist/preview release/**/*.js', watched: false, included: false, served: true },