David Catuhe 6 anos atrás
pai
commit
ef59cbec46
32 arquivos alterados com 450 adições e 97 exclusões
  1. 33 1
      Playground/babylon.d.txt
  2. 1 1
      Playground/css/frame.css
  3. 0 1
      Playground/frame.html
  4. 0 1
      Playground/index-local.html
  5. 1 33
      Playground/js/frame.js
  6. 34 1
      dist/preview release/babylon.d.ts
  7. 2 2
      dist/preview release/babylon.js
  8. 98 5
      dist/preview release/babylon.max.js
  9. 1 1
      dist/preview release/babylon.max.js.map
  10. 68 2
      dist/preview release/babylon.module.d.ts
  11. 34 1
      dist/preview release/documentation.d.ts
  12. 5 1
      dist/preview release/nodeEditor/babylon.nodeEditor.d.ts
  13. 6 6
      dist/preview release/nodeEditor/babylon.nodeEditor.js
  14. 34 14
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js
  15. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map
  16. 11 2
      dist/preview release/nodeEditor/babylon.nodeEditor.module.d.ts
  17. 1 1
      dist/preview release/packagesSizeBaseLine.json
  18. 68 2
      dist/preview release/viewer/babylon.module.d.ts
  19. 3 3
      dist/preview release/viewer/babylon.viewer.js
  20. 1 1
      dist/preview release/viewer/babylon.viewer.max.js
  21. 1 1
      nodeEditor/src/components/diagram/generic/genericNodeModel.tsx
  22. 4 1
      nodeEditor/src/components/diagram/input/inputNodePropertyComponent.tsx
  23. 2 1
      nodeEditor/src/components/diagram/input/inputNodeWidget.tsx
  24. 1 1
      nodeEditor/src/components/diagram/light/lightPropertyTabComponent.tsx
  25. 1 1
      nodeEditor/src/components/diagram/remap/remapNodePropertyComponent.tsx
  26. 1 1
      nodeEditor/src/components/diagram/texture/texturePropertyTabComponent.tsx
  27. 1 1
      nodeEditor/src/components/diagram/trigonometry/trigonometryNodePropertyComponent.tsx
  28. 1 0
      nodeEditor/src/globalState.ts
  29. 14 3
      nodeEditor/src/graphEditor.tsx
  30. 18 3
      nodeEditor/src/sharedComponents/textInputLineComponent.tsx
  31. 2 2
      src/Materials/effect.ts
  32. 2 2
      src/Sprites/spriteManager.ts

+ 33 - 1
Playground/babylon.d.txt

@@ -11097,6 +11097,22 @@ declare module BABYLON {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
private _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -11215,6 +11231,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -11297,6 +11321,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -27607,7 +27639,7 @@ declare module BABYLON {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.

+ 1 - 1
Playground/css/frame.css

@@ -41,7 +41,7 @@ canvas {
     padding: 0;
     right: 0;
     left: 0;
-    background-color: #3B789A;
+    background-color: #201936;
 }
 
 .footerRight {

+ 0 - 1
Playground/frame.html

@@ -12,7 +12,6 @@
     <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
     <link rel="shortcut icon" href="https://www.babylonjs.com/img/favicon/favicon.ico">
 
-    <link rel="manifest" href="https://www.babylonjs.com/img/favicon/manifest.json">
     <meta name="msapplication-TileColor" content="#ffffff">
     <meta name="msapplication-TileImage" content="https://www.babylonjs.com/img/favicon/ms-icon-144x144.png">
     <meta name="msapplication-config" content="https://www.babylonjs.com/img/favicon/browserconfig.xml">

+ 0 - 1
Playground/index-local.html

@@ -371,7 +371,6 @@
     <script src="js/settingsPG.js"></script>
     <script src="js/utils.js"></script>
     <script src="js/zipTool.js"></script>
-    <script src="js/index.js"></script>
     
     <script>
         BABYLONDEVTOOLS.Loader

+ 1 - 33
Playground/js/frame.js

@@ -1,16 +1,10 @@
-import { utils } from "mocha";
-
-// TO DO - Rewrite frame.js to work with the new class architecture.
-
+
 (function() {
     var snippetUrl = "https://snippet.babylonjs.com";
-    var currentSnippetToken;
     var engine;
     var fpsLabel = document.getElementById("fpsLabel");
     var refreshAnchor = document.getElementById("refresh");
     var editAnchor = document.getElementById("edit");
-    var scripts;
-    var zipCode;
 
     if (location.href.toLowerCase().indexOf("noui") > -1) {
         fpsLabel.style.visibility = "hidden";
@@ -22,30 +16,6 @@
     }
 
     BABYLON.Engine.ShadersRepository = "/src/Shaders/";
-    var loadScript = function(scriptURL, title) {
-        var xhr = new XMLHttpRequest();
-
-        xhr.open('GET', scriptURL, true);
-
-        xhr.onreadystatechange = function() {
-            if (xhr.readyState === 4) {
-                if (xhr.status === 200) {
-                    monacoCreator.BlockEditorChange.lockEditorChange = true;
-                    console.log(xhr.responseText);
-                    jsEditor.setValue(xhr.responseText);
-                    jsEditor.setPosition({ lineNumber: 0, column: 0 });
-                    monacoCreator.BlockEditorChange = false;
-                    compileAndRun();
-
-                    document.getElementById("currentScript").innerHTML = title;
-
-                    currentSnippetToken = null;
-                }
-            }
-        };
-
-        xhr.send(null);
-    };
 
     var showError = function(error) {
         utils.showError(error, null);
@@ -66,8 +36,6 @@
 
             var canvas = document.getElementById("renderCanvas");
 
-            var checkCamera = true;
-            var wrappedEval = false;
             var createEngineFunction = "createDefaultEngine";
             var createSceneFunction;
 

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

@@ -11213,6 +11213,23 @@ declare module BABYLON {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -11331,6 +11348,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -11413,6 +11438,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -28144,7 +28177,7 @@ declare module BABYLON {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.

Diferenças do arquivo suprimidas por serem muito extensas
+ 2 - 2
dist/preview release/babylon.js


+ 98 - 5
dist/preview release/babylon.max.js

@@ -78731,7 +78731,7 @@ var EffectFallbacks = /** @class */ (function () {
             this._maxRank = rank;
         }
     };
-    Object.defineProperty(EffectFallbacks.prototype, "isMoreFallbacks", {
+    Object.defineProperty(EffectFallbacks.prototype, "hasMoreFallbacks", {
         /**
          * Checks to see if more fallbacks are still availible.
          */
@@ -79355,7 +79355,7 @@ var Effect = /** @class */ (function () {
         }
         if (fallbacks) {
             this._pipelineContext = null;
-            if (fallbacks.isMoreFallbacks) {
+            if (fallbacks.hasMoreFallbacks) {
                 _Misc_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].Error("Trying next fallback.");
                 this.defines = fallbacks.reduce(this.defines, this);
                 this._prepareEffect();
@@ -154538,8 +154538,8 @@ var SpriteManager = /** @class */ (function () {
         var max = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Zero();
         var distance = Number.MAX_VALUE;
         var currentSprite = null;
-        var pickedPoint = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Zero();
-        var cameraSpacePosition = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Zero();
+        var pickedPoint = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[0];
+        var cameraSpacePosition = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[1];
         var cameraView = camera.getViewMatrix();
         for (var index = 0; index < count; index++) {
             var sprite = this.sprites[index];
@@ -154575,7 +154575,7 @@ var SpriteManager = /** @class */ (function () {
             result.pickedSprite = currentSprite;
             result.distance = distance;
             // Get picked point
-            var direction = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[0];
+            var direction = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[2];
             direction.copyFrom(ray.direction);
             direction.normalize();
             direction.scaleInPlace(distance);
@@ -154586,6 +154586,57 @@ var SpriteManager = /** @class */ (function () {
         return null;
     };
     /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+    SpriteManager.prototype.multiIntersects = function (ray, camera, predicate) {
+        var count = Math.min(this._capacity, this.sprites.length);
+        var min = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Zero();
+        var max = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Zero();
+        var distance;
+        var results = [];
+        var pickedPoint = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[0].copyFromFloats(0, 0, 0);
+        var cameraSpacePosition = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[1].copyFromFloats(0, 0, 0);
+        var cameraView = camera.getViewMatrix();
+        for (var index = 0; index < count; index++) {
+            var sprite = this.sprites[index];
+            if (!sprite) {
+                continue;
+            }
+            if (predicate) {
+                if (!predicate(sprite)) {
+                    continue;
+                }
+            }
+            else if (!sprite.isPickable) {
+                continue;
+            }
+            _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);
+            min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);
+            max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);
+            if (ray.intersectsBoxMinMax(min, max)) {
+                distance = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Distance(cameraSpacePosition, ray.origin);
+                var result = new _Collisions_pickingInfo__WEBPACK_IMPORTED_MODULE_5__["PickingInfo"]();
+                results.push(result);
+                cameraView.invertToRef(_Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Matrix[0]);
+                result.hit = true;
+                result.pickedSprite = sprite;
+                result.distance = distance;
+                // Get picked point
+                var direction = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Vector3[2];
+                direction.copyFrom(ray.direction);
+                direction.normalize();
+                direction.scaleInPlace(distance);
+                ray.origin.addToRef(direction, pickedPoint);
+                result.pickedPoint = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinates(pickedPoint, _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["TmpVectors"].Matrix[0]);
+            }
+        }
+        return results;
+    };
+    /**
      * Render all child sprites
      */
     SpriteManager.prototype.render = function () {
@@ -154786,6 +154837,31 @@ _scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype._internalPickSprites = fu
     }
     return pickingInfo || new _Collisions_pickingInfo__WEBPACK_IMPORTED_MODULE_3__["PickingInfo"]();
 };
+_scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype._internalMultiPickSprites = function (ray, predicate, camera) {
+    if (!_Collisions_pickingInfo__WEBPACK_IMPORTED_MODULE_3__["PickingInfo"]) {
+        return null;
+    }
+    var pickingInfos = new Array();
+    if (!camera) {
+        if (!this.activeCamera) {
+            return null;
+        }
+        camera = this.activeCamera;
+    }
+    if (this.spriteManagers.length > 0) {
+        for (var spriteIndex = 0; spriteIndex < this.spriteManagers.length; spriteIndex++) {
+            var spriteManager = this.spriteManagers[spriteIndex];
+            if (!spriteManager.isPickable) {
+                continue;
+            }
+            var results = spriteManager.multiIntersects(ray, camera, predicate);
+            if (results !== null) {
+                pickingInfos = pickingInfos.concat(results);
+            }
+        }
+    }
+    return pickingInfos;
+};
 _scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype.pickSprite = function (x, y, predicate, fastCheck, camera) {
     this.createPickingRayInCameraSpaceToRef(x, y, this._tempSpritePickingRay, camera);
     return this._internalPickSprites(this._tempSpritePickingRay, predicate, fastCheck, camera);
@@ -154803,6 +154879,23 @@ _scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype.pickSpriteWithRay = funct
     _Culling_ray__WEBPACK_IMPORTED_MODULE_2__["Ray"].TransformToRef(ray, camera.getViewMatrix(), this._tempSpritePickingRay);
     return this._internalPickSprites(this._tempSpritePickingRay, predicate, fastCheck, camera);
 };
+_scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype.multiPickSprite = function (x, y, predicate, camera) {
+    this.createPickingRayInCameraSpaceToRef(x, y, this._tempSpritePickingRay, camera);
+    return this._internalMultiPickSprites(this._tempSpritePickingRay, predicate, camera);
+};
+_scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype.multiPickSpriteWithRay = function (ray, predicate, camera) {
+    if (!this._tempSpritePickingRay) {
+        return null;
+    }
+    if (!camera) {
+        if (!this.activeCamera) {
+            return null;
+        }
+        camera = this.activeCamera;
+    }
+    _Culling_ray__WEBPACK_IMPORTED_MODULE_2__["Ray"].TransformToRef(ray, camera.getViewMatrix(), this._tempSpritePickingRay);
+    return this._internalMultiPickSprites(this._tempSpritePickingRay, predicate, camera);
+};
 _scene__WEBPACK_IMPORTED_MODULE_1__["Scene"].prototype.setPointerOverSprite = function (sprite) {
     if (this._pointerOverSprite === sprite) {
         return;

Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 1
dist/preview release/babylon.max.js.map


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

@@ -11398,6 +11398,23 @@ declare module "babylonjs/Sprites/spriteSceneComponent" {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -11530,6 +11547,14 @@ declare module "babylonjs/Sprites/spriteManager" {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -11612,6 +11637,14 @@ declare module "babylonjs/Sprites/spriteManager" {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -28961,7 +28994,7 @@ declare module "babylonjs/Materials/effect" {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.
@@ -75888,6 +75921,23 @@ declare module BABYLON {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -76006,6 +76056,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -76088,6 +76146,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -92819,7 +92885,7 @@ declare module BABYLON {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.

+ 34 - 1
dist/preview release/documentation.d.ts

@@ -11213,6 +11213,23 @@ declare module BABYLON {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -11331,6 +11348,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -11413,6 +11438,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -28144,7 +28177,7 @@ declare module BABYLON {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.

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

@@ -57,6 +57,7 @@ declare module NODEEDITOR {
 declare module NODEEDITOR {
     interface ITextInputLineComponentProps {
         label: string;
+        globalState: GlobalState;
         target?: any;
         propertyName?: string;
         value?: string;
@@ -72,7 +73,7 @@ declare module NODEEDITOR {
             value: string;
         }): boolean;
         raiseOnPropertyChanged(newValue: string, previousValue: string): void;
-        updateValue(value: string): void;
+        updateValue(value: string, raisePropertyChanged: boolean): void;
         render(): JSX.Element;
     }
 }
@@ -1002,6 +1003,7 @@ declare module NODEEDITOR {
         private _copiedNode;
         private _mouseLocationX;
         private _mouseLocationY;
+        private _onWidgetKeyUpPointer;
         /** @hidden */
         _toAdd: LinkModel[] | null;
         /**
@@ -1010,6 +1012,7 @@ declare module NODEEDITOR {
          */
         createNodeFromObject(options: NodeCreationOptions): DefaultNodeModel;
         addValueNode(type: string): DefaultNodeModel;
+        onWidgetKeyUp(evt: any): void;
         componentDidMount(): void;
         componentWillUnmount(): void;
         constructor(props: IGraphEditorProps);
@@ -1061,6 +1064,7 @@ declare module NODEEDITOR {
         onPreviewMeshTypeChanged: BABYLON.Observable<void>;
         onGetNodeFromBlock: (block: BABYLON.NodeMaterialBlock) => NodeModel;
         previewMeshType: PreviewMeshType;
+        blockKeyboardEvents: boolean;
         constructor();
     }
 }

Diferenças do arquivo suprimidas por serem muito extensas
+ 6 - 6
dist/preview release/nodeEditor/babylon.nodeEditor.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 34 - 14
dist/preview release/nodeEditor/babylon.nodeEditor.max.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map


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

@@ -87,8 +87,10 @@ declare module "babylonjs-node-editor/sharedComponents/textInputLineComponent" {
     import * as React from "react";
     import { Observable } from "babylonjs/Misc/observable";
     import { PropertyChangedEvent } from "babylonjs-node-editor/sharedComponents/propertyChangedEvent";
+    import { GlobalState } from "babylonjs-node-editor/globalState";
     interface ITextInputLineComponentProps {
         label: string;
+        globalState: GlobalState;
         target?: any;
         propertyName?: string;
         value?: string;
@@ -104,7 +106,7 @@ declare module "babylonjs-node-editor/sharedComponents/textInputLineComponent" {
             value: string;
         }): boolean;
         raiseOnPropertyChanged(newValue: string, previousValue: string): void;
-        updateValue(value: string): void;
+        updateValue(value: string, raisePropertyChanged: boolean): void;
         render(): JSX.Element;
     }
 }
@@ -1195,6 +1197,7 @@ declare module "babylonjs-node-editor/graphEditor" {
         private _copiedNode;
         private _mouseLocationX;
         private _mouseLocationY;
+        private _onWidgetKeyUpPointer;
         /** @hidden */
         _toAdd: LinkModel[] | null;
         /**
@@ -1203,6 +1206,7 @@ declare module "babylonjs-node-editor/graphEditor" {
          */
         createNodeFromObject(options: NodeCreationOptions): DefaultNodeModel;
         addValueNode(type: string): DefaultNodeModel;
+        onWidgetKeyUp(evt: any): void;
         componentDidMount(): void;
         componentWillUnmount(): void;
         constructor(props: IGraphEditorProps);
@@ -1269,6 +1273,7 @@ declare module "babylonjs-node-editor/globalState" {
         onPreviewMeshTypeChanged: Observable<void>;
         onGetNodeFromBlock: (block: NodeMaterialBlock) => NodeModel;
         previewMeshType: PreviewMeshType;
+        blockKeyboardEvents: boolean;
         constructor();
     }
 }
@@ -1365,6 +1370,7 @@ declare module NODEEDITOR {
 declare module NODEEDITOR {
     interface ITextInputLineComponentProps {
         label: string;
+        globalState: GlobalState;
         target?: any;
         propertyName?: string;
         value?: string;
@@ -1380,7 +1386,7 @@ declare module NODEEDITOR {
             value: string;
         }): boolean;
         raiseOnPropertyChanged(newValue: string, previousValue: string): void;
-        updateValue(value: string): void;
+        updateValue(value: string, raisePropertyChanged: boolean): void;
         render(): JSX.Element;
     }
 }
@@ -2310,6 +2316,7 @@ declare module NODEEDITOR {
         private _copiedNode;
         private _mouseLocationX;
         private _mouseLocationY;
+        private _onWidgetKeyUpPointer;
         /** @hidden */
         _toAdd: LinkModel[] | null;
         /**
@@ -2318,6 +2325,7 @@ declare module NODEEDITOR {
          */
         createNodeFromObject(options: NodeCreationOptions): DefaultNodeModel;
         addValueNode(type: string): DefaultNodeModel;
+        onWidgetKeyUp(evt: any): void;
         componentDidMount(): void;
         componentWillUnmount(): void;
         constructor(props: IGraphEditorProps);
@@ -2369,6 +2377,7 @@ declare module NODEEDITOR {
         onPreviewMeshTypeChanged: BABYLON.Observable<void>;
         onGetNodeFromBlock: (block: BABYLON.NodeMaterialBlock) => NodeModel;
         previewMeshType: PreviewMeshType;
+        blockKeyboardEvents: boolean;
         constructor();
     }
 }

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

@@ -1 +1 @@
-{"engineOnly":167205,"sceneOnly":507509,"minGridMaterial":636969,"minStandardMaterial":766170}
+{"engineOnly":167207,"sceneOnly":507511,"minGridMaterial":636971,"minStandardMaterial":766172}

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

@@ -11398,6 +11398,23 @@ declare module "babylonjs/Sprites/spriteSceneComponent" {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -11530,6 +11547,14 @@ declare module "babylonjs/Sprites/spriteManager" {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -11612,6 +11637,14 @@ declare module "babylonjs/Sprites/spriteManager" {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -28961,7 +28994,7 @@ declare module "babylonjs/Materials/effect" {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.
@@ -75888,6 +75921,23 @@ declare module BABYLON {
              * @returns a PickingInfo
              */
             pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
+            /** @hidden */
+            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Launch a ray to try to pick sprites in the scene
+             * @param x position on screen
+             * @param y position on screen
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
+            /** Use the given ray to pick sprites in the scene
+             * @param ray The ray (in world space) to use to pick meshes
+             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
+             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
+             * @returns a PickingInfo array
+             */
+            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
             /**
              * Force the sprite under the pointer
              * @param sprite defines the sprite to use
@@ -76006,6 +76056,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+     * Intersects the sprites with a ray
+     * @param ray defines the ray to intersect with
+     * @param camera defines the current active camera
+     * @param predicate defines a predicate used to select candidate sprites
+     * @returns null if no hit or a PickingInfo array
+     */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Renders the list of sprites on screen.
          */
         render(): void;
@@ -76088,6 +76146,14 @@ declare module BABYLON {
          */
         intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
         /**
+         * Intersects the sprites with a ray
+         * @param ray defines the ray to intersect with
+         * @param camera defines the current active camera
+         * @param predicate defines a predicate used to select candidate sprites
+         * @returns null if no hit or a PickingInfo array
+         */
+        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
+        /**
          * Render all child sprites
          */
         render(): void;
@@ -92819,7 +92885,7 @@ declare module BABYLON {
         /**
          * Checks to see if more fallbacks are still availible.
          */
-        readonly isMoreFallbacks: boolean;
+        readonly hasMoreFallbacks: boolean;
         /**
          * Removes the defines that should be removed when falling back.
          * @param currentDefines defines the current define statements for the shader.

Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 3
dist/preview release/viewer/babylon.viewer.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 1
dist/preview release/viewer/babylon.viewer.max.js


+ 1 - 1
nodeEditor/src/components/diagram/generic/genericNodeModel.tsx

@@ -48,7 +48,7 @@ export class GenericNodeModel extends DefaultNodeModel {
         return (
             <div>
             <LineContainerComponent title="GENERAL">
-                <TextInputLineComponent label="Name" propertyName="name" target={this.block!} onChange={() => globalState.onUpdateRequiredObservable.notifyObservers()} />
+                <TextInputLineComponent globalState={globalState} label="Name" propertyName="name" target={this.block!} onChange={() => globalState.onUpdateRequiredObservable.notifyObservers()} />
                 <TextLineComponent label="Type" value={this.block!.getClassName()} />
             </LineContainerComponent>
             {

+ 4 - 1
nodeEditor/src/components/diagram/input/inputNodePropertyComponent.tsx

@@ -130,7 +130,10 @@ export class InputPropertyTabComponentProps extends React.Component<IInputProper
         return (
             <div>
                 <LineContainerComponent title="GENERAL">
-                    <TextInputLineComponent label="Name" propertyName="name" target={inputBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    {
+                        !inputBlock.isAttribute &&
+                        <TextInputLineComponent  globalState={this.props.globalState} label="Name" propertyName="name" target={inputBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    }
                     <TextLineComponent label="Type" value={StringTools.GetBaseType(inputBlock.type)} />
                 </LineContainerComponent>
                 <LineContainerComponent title="PROPERTIES">

+ 2 - 1
nodeEditor/src/components/diagram/input/inputNodeWidget.tsx

@@ -56,12 +56,13 @@ export class InputNodeWidget extends React.Component<IInputNodeWidgetProps> {
 
         let inputBlock = this.props.node!.inputBlock;
         let value = "";
-        let name = StringTools.GetBaseType(inputBlock.output.type);
+        let name = `${inputBlock.name} (${StringTools.GetBaseType(inputBlock.output.type)})`;
         let color = "";
 
         if (inputBlock) {
             if (inputBlock.isAttribute) {
                 value = "mesh." + inputBlock.name;
+                name = StringTools.GetBaseType(inputBlock.output.type);
             } else if (inputBlock.isWellKnownValue) {
                 switch (inputBlock.wellKnownValue) {
                     case NodeMaterialWellKnownValues.World:

+ 1 - 1
nodeEditor/src/components/diagram/light/lightPropertyTabComponent.tsx

@@ -26,7 +26,7 @@ export class LightPropertyTabComponent extends React.Component<ILightPropertyTab
             <div>
                 <LineContainerComponent title="GENERAL">
                     <TextLineComponent label="Type" value="Light" />
-                    <TextInputLineComponent label="Name" propertyName="name" target={this.props.node.block!} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    <TextInputLineComponent globalState={this.props.globalState} label="Name" propertyName="name" target={this.props.node.block!} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
                 </LineContainerComponent>
 
                 <LineContainerComponent title="PROPERTIES">

+ 1 - 1
nodeEditor/src/components/diagram/remap/remapNodePropertyComponent.tsx

@@ -29,7 +29,7 @@ export class RemapPropertyTabComponentProps extends React.Component<IRemapProper
         return (
             <div>
                 <LineContainerComponent title="GENERAL">
-                    <TextInputLineComponent label="Name" propertyName="name" target={remapBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    <TextInputLineComponent globalState={this.props.globalState} label="Name" propertyName="name" target={remapBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
                     <TextLineComponent label="Type" value={remapBlock.getClassName()} />
                 </LineContainerComponent>
                 <LineContainerComponent title="PROPERTIES">

+ 1 - 1
nodeEditor/src/components/diagram/texture/texturePropertyTabComponent.tsx

@@ -67,7 +67,7 @@ export class TexturePropertyTabComponent extends React.Component<ITexturePropert
             <div>
                 <LineContainerComponent title="GENERAL">
                     <TextLineComponent label="Type" value="Texture" />
-                    <TextInputLineComponent label="Name" propertyName="name" target={this.props.node.block!} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    <TextInputLineComponent globalState={this.props.globalState} label="Name" propertyName="name" target={this.props.node.block!} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
                 </LineContainerComponent>
 
                 <LineContainerComponent title="PROPERTIES">

+ 1 - 1
nodeEditor/src/components/diagram/trigonometry/trigonometryNodePropertyComponent.tsx

@@ -31,7 +31,7 @@ export class TrigonometryPropertyTabComponentProps extends React.Component<ITrig
         return (
             <div>
                 <LineContainerComponent title="GENERAL">
-                    <TextInputLineComponent label="Name" propertyName="name" target={trigonometryBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
+                    <TextInputLineComponent globalState={this.props.globalState} label="Name" propertyName="name" target={trigonometryBlock} onChange={() => this.props.globalState.onUpdateRequiredObservable.notifyObservers()} />
                     <TextLineComponent label="Type" value={trigonometryBlock.getClassName()} />
                 </LineContainerComponent>
                 <LineContainerComponent title="PROPERTIES">  

+ 1 - 0
nodeEditor/src/globalState.ts

@@ -24,6 +24,7 @@ export class GlobalState {
     onPreviewMeshTypeChanged = new Observable<void>();
     onGetNodeFromBlock: (block: NodeMaterialBlock) => NodeModel;
     previewMeshType: PreviewMeshType;
+    blockKeyboardEvents = false;
 
     public constructor() {
         this.previewMeshType = DataStorage.ReadNumber("PreviewMeshType", PreviewMeshType.Box);

+ 14 - 3
nodeEditor/src/graphEditor.tsx

@@ -76,6 +76,7 @@ export class GraphEditor extends React.Component<IGraphEditorProps> {
     private _copiedNode: Nullable<DefaultNodeModel> = null;
     private _mouseLocationX = 0;
     private _mouseLocationY = 0;
+    private _onWidgetKeyUpPointer: any;
 
     /** @hidden */
     public _toAdd: LinkModel[] | null = [];
@@ -135,11 +136,22 @@ export class GraphEditor extends React.Component<IGraphEditorProps> {
         return localNode;
     }
 
+    onWidgetKeyUp(evt: any) {        
+        var widget = (this.refs["test"] as DiagramWidget);
+
+        if (!widget || this.props.globalState.blockKeyboardEvents) {
+            return;
+        }
+
+        widget.onKeyUp(evt)
+    }
+
     componentDidMount() {
         if (this.props.globalState.hostDocument) {
             var widget = (this.refs["test"] as DiagramWidget);
             widget.setState({ document: this.props.globalState.hostDocument })
-            this.props.globalState.hostDocument!.addEventListener("keyup", widget.onKeyUpPointer as any, false);
+            this._onWidgetKeyUpPointer = this.onWidgetKeyUp.bind(this)
+            this.props.globalState.hostDocument!.addEventListener("keyup", this._onWidgetKeyUpPointer, false);
 
             this._previewManager = new PreviewManager(this.props.globalState.hostDocument.getElementById("preview-canvas") as HTMLCanvasElement, this.props.globalState);
         }
@@ -147,8 +159,7 @@ export class GraphEditor extends React.Component<IGraphEditorProps> {
 
     componentWillUnmount() {
         if (this.props.globalState.hostDocument) {
-            var widget = (this.refs["test"] as DiagramWidget);
-            this.props.globalState.hostDocument!.removeEventListener("keyup", widget.onKeyUpPointer as any, false);
+            this.props.globalState.hostDocument!.removeEventListener("keyup", this._onWidgetKeyUpPointer, false);
         }
 
         this._previewManager.dispose();

+ 18 - 3
nodeEditor/src/sharedComponents/textInputLineComponent.tsx

@@ -1,9 +1,11 @@
 import * as React from "react";
 import { Observable } from "babylonjs/Misc/observable";
 import { PropertyChangedEvent } from "./propertyChangedEvent";
+import { GlobalState } from '../globalState';
 
 interface ITextInputLineComponentProps {
     label: string;
+    globalState: GlobalState;
     target?: any;
     propertyName?: string;
     value?: string;
@@ -52,13 +54,15 @@ export class TextInputLineComponent extends React.Component<ITextInputLineCompon
         });
     }
 
-    updateValue(value: string) {
+    updateValue(value: string, raisePropertyChanged: boolean) {
 
         this._localChange = true;
         const store = this.props.value || this.props.target[this.props.propertyName!];
         this.setState({ value: value });
 
-        this.raiseOnPropertyChanged(value, store);
+        if (raisePropertyChanged) {
+            this.raiseOnPropertyChanged(value, store);
+        }
 
         if (this.props.propertyName) {
             this.props.target[this.props.propertyName] = value;
@@ -72,7 +76,18 @@ export class TextInputLineComponent extends React.Component<ITextInputLineCompon
                     {this.props.label}
                 </div>
                 <div className="value">
-                    <input value={this.state.value} onChange={evt => this.updateValue(evt.target.value)} />
+                    <input value={this.state.value} 
+                        onFocus={() => this.props.globalState.blockKeyboardEvents = true}
+                        onChange={evt => this.updateValue(evt.target.value, false)}
+                        onKeyDown={evt => {
+                            if (evt.keyCode !== 13) {
+                                return;
+                            }
+                            this.updateValue(this.state.value, true);
+                        }} onBlur={evt => {
+                            this.updateValue(evt.target.value, true)
+                            this.props.globalState.blockKeyboardEvents = false;
+                        }}/>
                 </div>
             </div>
         );

+ 2 - 2
src/Materials/effect.ts

@@ -74,7 +74,7 @@ export class EffectFallbacks {
     /**
      * Checks to see if more fallbacks are still availible.
      */
-    public get isMoreFallbacks(): boolean {
+    public get hasMoreFallbacks(): boolean {
         return this._currentRank <= this._maxRank;
     }
 
@@ -802,7 +802,7 @@ export class Effect implements IDisposable {
 
         if (fallbacks) {
             this._pipelineContext = null;
-            if (fallbacks.isMoreFallbacks) {
+            if (fallbacks.hasMoreFallbacks) {
                 Logger.Error("Trying next fallback.");
                 this.defines = fallbacks.reduce(this.defines, this);
                 this._prepareEffect();

+ 2 - 2
src/Sprites/spriteManager.ts

@@ -350,8 +350,8 @@ export class SpriteManager implements ISpriteManager {
         var max = Vector3.Zero();
         var distance = Number.MAX_VALUE;
         var currentSprite: Nullable<Sprite> = null;
-        var pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);
-        var cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);
+        var pickedPoint = TmpVectors.Vector3[0];
+        var cameraSpacePosition = TmpVectors.Vector3[1];
         var cameraView = camera.getViewMatrix();
 
         for (var index = 0; index < count; index++) {