فهرست منبع

Merge remote-tracking branch 'upstream/master' into positioning-api

Raanan Weber 5 سال پیش
والد
کامیت
5667087635
50فایلهای تغییر یافته به همراه719 افزوده شده و 179 حذف شده
  1. 1 1
      Playground/debug.html
  2. 1 1
      Playground/js/zipTool.js
  3. BIN
      Playground/scenes/Elf/Elf.bin
  4. 1 0
      Playground/scenes/Elf/Elf.gltf
  5. BIN
      Playground/scenes/Elf/Elf_allAnimations.bin
  6. 1 0
      Playground/scenes/Elf/Elf_allAnimations.gltf
  7. BIN
      Playground/scenes/Elf/Elf_die.bin
  8. 1 0
      Playground/scenes/Elf/Elf_die.gltf
  9. BIN
      Playground/scenes/Elf/Elf_run.bin
  10. 1 0
      Playground/scenes/Elf/Elf_run.gltf
  11. 54 3
      dist/preview release/babylon.d.ts
  12. 2 2
      dist/preview release/babylon.js
  13. 128 51
      dist/preview release/babylon.max.js
  14. 1 1
      dist/preview release/babylon.max.js.map
  15. 115 6
      dist/preview release/babylon.module.d.ts
  16. 54 3
      dist/preview release/documentation.d.ts
  17. 1 1
      dist/preview release/glTF2Interface/package.json
  18. 2 2
      dist/preview release/gui/package.json
  19. 7 7
      dist/preview release/inspector/package.json
  20. 3 3
      dist/preview release/loaders/package.json
  21. 2 2
      dist/preview release/materialsLibrary/package.json
  22. 1 0
      dist/preview release/nodeEditor/babylon.nodeEditor.d.ts
  23. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.js
  24. 20 5
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js
  25. 1 1
      dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map
  26. 2 0
      dist/preview release/nodeEditor/babylon.nodeEditor.module.d.ts
  27. 2 2
      dist/preview release/nodeEditor/package.json
  28. 1 1
      dist/preview release/package.json
  29. 1 1
      dist/preview release/packagesSizeBaseLine.json
  30. 2 2
      dist/preview release/postProcessesLibrary/package.json
  31. 2 2
      dist/preview release/proceduralTexturesLibrary/package.json
  32. 3 3
      dist/preview release/serializers/package.json
  33. 115 6
      dist/preview release/viewer/babylon.module.d.ts
  34. 10 10
      dist/preview release/viewer/babylon.viewer.js
  35. 1 1
      dist/preview release/viewer/babylon.viewer.max.js
  36. 4 2
      dist/preview release/what's new.md
  37. 2 0
      nodeEditor/src/diagram/graphCanvas.tsx
  38. 21 6
      nodeEditor/src/diagram/graphFrame.ts
  39. 1 1
      package.json
  40. 5 5
      src/Behaviors/Meshes/pointerDragBehavior.ts
  41. 33 8
      src/Cameras/VR/vrExperienceHelper.ts
  42. 22 2
      src/Engines/Processors/shaderProcessor.ts
  43. 40 8
      src/Engines/thinEngine.ts
  44. 1 1
      src/Gizmos/boundingBoxGizmo.ts
  45. 2 0
      src/Materials/Textures/baseTexture.ts
  46. 8 3
      src/Materials/Textures/cubeTexture.ts
  47. 3 0
      src/Meshes/instancedMesh.ts
  48. 2 2
      src/Meshes/mesh.ts
  49. 23 17
      src/Misc/fileTools.ts
  50. 15 6
      src/scene.ts

+ 1 - 1
Playground/debug.html

@@ -94,7 +94,7 @@
 
 
 
-    <script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.min.js"></script>
+    <script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.js"></script>
 
     <!-- Monaco -->
     <script src="node_modules/monaco-editor/dev/vs/loader.js"></script>

+ 1 - 1
Playground/js/zipTool.js

@@ -67,7 +67,7 @@ class ZipTool {
         }
 
         if (textures[index].isCube) {
-            if (textures[index].name.indexOf("dds") === -1) {
+            if (textures[index].name.indexOf("dds") === -1 && textures[index].name.indexOf(".env") === -1) {
                 if (textures[index]._extensions) {
                     for (var i = 0; i < 6; i++) {
                         textures.push({ name: textures[index].name + textures[index]._extensions[i] });

BIN
Playground/scenes/Elf/Elf.bin


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
Playground/scenes/Elf/Elf.gltf


BIN
Playground/scenes/Elf/Elf_allAnimations.bin


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
Playground/scenes/Elf/Elf_allAnimations.gltf


BIN
Playground/scenes/Elf/Elf_die.bin


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
Playground/scenes/Elf/Elf_die.gltf


BIN
Playground/scenes/Elf/Elf_run.bin


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
Playground/scenes/Elf/Elf_run.gltf


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 54 - 3
dist/preview release/babylon.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 2
dist/preview release/babylon.js


+ 128 - 51
dist/preview release/babylon.max.js

@@ -9781,7 +9781,7 @@ var PointerDragBehavior = /** @class */ (function () {
         /**
          * If set, the drag plane/axis will be rotated based on the attached mesh's world rotation (Default: true)
          */
-        this.useObjectOrienationForDragging = true;
+        this.useObjectOrientationForDragging = true;
         /**
          * Predicate to determine if it is valid to move the object to a new position when it is moved
          */
@@ -10001,8 +10001,8 @@ var PointerDragBehavior = /** @class */ (function () {
             var dragLength = 0;
             // depending on the drag mode option drag accordingly
             if (this._options.dragAxis) {
-                // Convert local drag axis to world if useObjectOrienationForDragging
-                this.useObjectOrienationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis);
+                // Convert local drag axis to world if useObjectOrientationForDragging
+                this.useObjectOrientationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis);
                 // Project delta drag from the drag plane onto the drag axis
                 pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector);
                 dragLength = _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].Dot(this._tmpVector, this._worldDragAxis);
@@ -10060,7 +10060,7 @@ var PointerDragBehavior = /** @class */ (function () {
     PointerDragBehavior.prototype._updateDragPlanePosition = function (ray, dragPlanePosition) {
         this._pointA.copyFrom(dragPlanePosition);
         if (this._options.dragAxis) {
-            this.useObjectOrienationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis);
+            this.useObjectOrientationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis);
             // Calculate plane normal in direction of camera but perpendicular to drag axis
             this._pointA.addToRef(this._localAxis, this._pointB); // towards drag axis
             ray.origin.subtractToRef(this._pointA, this._pointC);
@@ -10077,7 +10077,7 @@ var PointerDragBehavior = /** @class */ (function () {
             this._dragPlane.lookAt(this._lookAt);
         }
         else if (this._options.dragPlaneNormal) {
-            this.useObjectOrienationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal);
+            this.useObjectOrientationForDragging ? _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Vector3"].TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal);
             this._dragPlane.position.copyFrom(this._pointA);
             this._pointA.addToRef(this._localAxis, this._lookAt);
             this._dragPlane.lookAt(this._lookAt);
@@ -17693,6 +17693,10 @@ var VRExperienceHelper = /** @class */ (function () {
         this._padSensibilityDown = 0.35;
         this._leftController = null;
         this._rightController = null;
+        this._gazeColor = new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7);
+        this._laserColor = new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7);
+        this._pickedLaserColor = new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.2, 0.2, 1);
+        this._pickedGazeColor = new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0, 0, 1);
         /**
          * Observable raised when a new mesh is selected based on meshSelectionPredicate
          */
@@ -19324,13 +19328,13 @@ var VRExperienceHelper = /** @class */ (function () {
                     this.onNewMeshPicked.notifyObservers(hit);
                     gazer._currentMeshSelected = hit.pickedMesh;
                     if (hit.pickedMesh.isPickable && hit.pickedMesh.actionManager) {
-                        this.changeGazeColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0, 0, 1));
-                        this.changeLaserColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.2, 0.2, 1));
+                        this.changeGazeColor(this._pickedGazeColor);
+                        this.changeLaserColor(this._pickedLaserColor);
                         gazer._isActionableMesh = true;
                     }
                     else {
-                        this.changeGazeColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
-                        this.changeLaserColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
+                        this.changeGazeColor(this._gazeColor);
+                        this.changeLaserColor(this._laserColor);
                         gazer._isActionableMesh = false;
                     }
                     try {
@@ -19347,8 +19351,8 @@ var VRExperienceHelper = /** @class */ (function () {
                 else {
                     this._notifySelectedMeshUnselected(gazer._currentMeshSelected);
                     gazer._currentMeshSelected = null;
-                    this.changeGazeColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
-                    this.changeLaserColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
+                    this.changeGazeColor(this._gazeColor);
+                    this.changeLaserColor(this._laserColor);
                 }
             }
         }
@@ -19356,8 +19360,8 @@ var VRExperienceHelper = /** @class */ (function () {
             this._notifySelectedMeshUnselected(gazer._currentMeshSelected);
             gazer._currentMeshSelected = null;
             //this._teleportationAllowed = false;
-            this.changeGazeColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
-            this.changeLaserColor(new _Maths_math_color__WEBPACK_IMPORTED_MODULE_10__["Color3"](0.7, 0.7, 0.7));
+            this.changeGazeColor(this._gazeColor);
+            this.changeLaserColor(this._laserColor);
         }
     };
     VRExperienceHelper.prototype._notifySelectedMeshUnselected = function (mesh) {
@@ -19366,6 +19370,26 @@ var VRExperienceHelper = /** @class */ (function () {
         }
     };
     /**
+     * Permanently set new colors for the laser pointer
+     * @param color the new laser color
+     * @param pickedColor the new laser color when picked mesh detected
+     */
+    VRExperienceHelper.prototype.setLaserColor = function (color, pickedColor) {
+        if (pickedColor === void 0) { pickedColor = this._pickedLaserColor; }
+        this._laserColor = color;
+        this._pickedLaserColor = pickedColor;
+    };
+    /**
+     * Permanently set new colors for the gaze pointer
+     * @param color the new gaze color
+     * @param pickedColor the new gaze color when picked mesh detected
+     */
+    VRExperienceHelper.prototype.setGazeColor = function (color, pickedColor) {
+        if (pickedColor === void 0) { pickedColor = this._pickedGazeColor; }
+        this._gazeColor = color;
+        this._pickedGazeColor = pickedColor;
+    };
+    /**
      * Sets the color of the laser ray from the vr controllers.
      * @param color new color for the ray.
      */
@@ -34397,7 +34421,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _Expressions_Operators_shaderDefineOrOperator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Expressions/Operators/shaderDefineOrOperator */ "./Engines/Processors/Expressions/Operators/shaderDefineOrOperator.ts");
 /* harmony import */ var _Expressions_Operators_shaderDefineAndOperator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Expressions/Operators/shaderDefineAndOperator */ "./Engines/Processors/Expressions/Operators/shaderDefineAndOperator.ts");
 /* harmony import */ var _Expressions_Operators_shaderDefineArithmeticOperator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Expressions/Operators/shaderDefineArithmeticOperator */ "./Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.ts");
-/* harmony import */ var _Misc_fileTools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Misc/fileTools */ "./Misc/fileTools.ts");
+/* harmony import */ var _Misc_devTools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Misc/devTools */ "./Misc/devTools.ts");
 
 
 
@@ -34681,7 +34705,7 @@ var ShaderProcessor = /** @class */ (function () {
             }
             else {
                 var includeShaderUrl = options.shadersRepository + "ShadersInclude/" + includeFile + ".fx";
-                _Misc_fileTools__WEBPACK_IMPORTED_MODULE_8__["FileTools"].LoadFile(includeShaderUrl, function (fileContent) {
+                ShaderProcessor._FileToolsLoadFile(includeShaderUrl, function (fileContent) {
                     options.includesShadersStore[includeFile] = fileContent;
                     _this._ProcessIncludes(returnValue, options, callback);
                 });
@@ -34691,6 +34715,20 @@ var ShaderProcessor = /** @class */ (function () {
         }
         callback(returnValue);
     };
+    /**
+     * Loads a file from a url
+     * @param url url to load
+     * @param onSuccess callback called when the file successfully loads
+     * @param onProgress callback called while file is loading (if the server supports this mode)
+     * @param offlineProvider defines the offline provider for caching
+     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
+     * @param onError callback called when the file fails to load
+     * @returns a file request object
+     * @hidden
+     */
+    ShaderProcessor._FileToolsLoadFile = function (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) {
+        throw _Misc_devTools__WEBPACK_IMPORTED_MODULE_8__["_DevTools"].WarnImport("FileTools");
+    };
     return ShaderProcessor;
 }());
 
@@ -39144,9 +39182,7 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _WebGL_webGL2ShaderProcessors__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./WebGL/webGL2ShaderProcessors */ "./Engines/WebGL/webGL2ShaderProcessors.ts");
 /* harmony import */ var _Meshes_WebGL_webGLDataBuffer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Meshes/WebGL/webGLDataBuffer */ "./Meshes/WebGL/webGLDataBuffer.ts");
 /* harmony import */ var _WebGL_webGLPipelineContext__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./WebGL/webGLPipelineContext */ "./Engines/WebGL/webGLPipelineContext.ts");
-/* harmony import */ var _Misc_fileTools__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Misc/fileTools */ "./Misc/fileTools.ts");
-/* harmony import */ var _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../Misc/canvasGenerator */ "./Misc/canvasGenerator.ts");
-
+/* harmony import */ var _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Misc/canvasGenerator */ "./Misc/canvasGenerator.ts");
 
 
 
@@ -39420,7 +39456,7 @@ var ThinEngine = /** @class */ (function () {
                     this._gl = (canvas.getContext("webgl2", options) || canvas.getContext("experimental-webgl2", options));
                     if (this._gl) {
                         this._webGLVersion = 2.0;
-                        // Prevent weird browsers to lie :-)
+                        // Prevent weird browsers to lie
                         if (!this._gl.deleteQuery) {
                             this._webGLVersion = 1.0;
                         }
@@ -39489,7 +39525,7 @@ var ThinEngine = /** @class */ (function () {
          */
         // Not mixed with Version for tooling purpose.
         get: function () {
-            return "babylonjs@4.1.0-beta.12";
+            return "babylonjs@4.1.0-beta.15";
         },
         enumerable: true,
         configurable: true
@@ -39499,7 +39535,7 @@ var ThinEngine = /** @class */ (function () {
          * Returns the current version of the framework
          */
         get: function () {
-            return "4.1.0-beta.12";
+            return "4.1.0-beta.15";
         },
         enumerable: true,
         configurable: true
@@ -39943,7 +39979,7 @@ var ThinEngine = /** @class */ (function () {
         if (this._workingCanvas) {
             return;
         }
-        this._workingCanvas = _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_15__["CanvasGenerator"].CreateCanvas(1, 1);
+        this._workingCanvas = _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_14__["CanvasGenerator"].CreateCanvas(1, 1);
         var context = this._workingCanvas.getContext("2d");
         if (context) {
             this._workingContext = context;
@@ -41693,11 +41729,11 @@ var ThinEngine = /** @class */ (function () {
                     onload(buffer);
                 }
                 else {
-                    _Misc_fileTools__WEBPACK_IMPORTED_MODULE_14__["FileTools"].LoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
+                    ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
                 }
             }
             else if (typeof buffer === "string" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {
-                _Misc_fileTools__WEBPACK_IMPORTED_MODULE_14__["FileTools"].LoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
+                ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
             }
             else if (buffer) {
                 onload(buffer);
@@ -41706,6 +41742,19 @@ var ThinEngine = /** @class */ (function () {
         return texture;
     };
     /**
+     * Loads an image as an HTMLImageElement.
+     * @param input url string, ArrayBuffer, or Blob to load
+     * @param onLoad callback called when the image successfully loads
+     * @param onError callback called when the image fails to load
+     * @param offlineProvider offline provider for caching
+     * @param mimeType optional mime type
+     * @returns the HTMLImageElement of the loaded image
+     * @hidden
+     */
+    ThinEngine._FileToolsLoadImage = function (input, onLoad, onError, offlineProvider, mimeType) {
+        throw _Misc_devTools__WEBPACK_IMPORTED_MODULE_2__["_DevTools"].WarnImport("FileTools");
+    };
+    /**
      * @hidden
      */
     ThinEngine.prototype._rescaleTexture = function (source, destination, scene, internalFormat, onComplete) {
@@ -41902,7 +41951,7 @@ var ThinEngine = /** @class */ (function () {
         var gl = this._gl;
         var textureType = this._getWebGLTextureType(texture.type);
         var format = this._getInternalFormat(texture.format);
-        var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, format) : this._getInternalFormat(babylonInternalFormat);
+        var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format) : this._getInternalFormat(babylonInternalFormat);
         this._unpackFlipY(texture.invertY);
         var target = gl.TEXTURE_2D;
         if (texture.isCube) {
@@ -42589,6 +42638,8 @@ var ThinEngine = /** @class */ (function () {
                         return this._gl.LUMINANCE;
                     case _constants__WEBPACK_IMPORTED_MODULE_7__["Constants"].TEXTUREFORMAT_LUMINANCE_ALPHA:
                         return this._gl.LUMINANCE_ALPHA;
+                    case _constants__WEBPACK_IMPORTED_MODULE_7__["Constants"].TEXTUREFORMAT_RGB:
+                        return this._gl.RGB;
                 }
             }
             return this._gl.RGBA;
@@ -42753,7 +42804,7 @@ var ThinEngine = /** @class */ (function () {
     /** @hidden */
     ThinEngine.prototype._loadFile = function (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) {
         var _this = this;
-        var request = _Misc_fileTools__WEBPACK_IMPORTED_MODULE_14__["FileTools"].LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);
+        var request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);
         this._activeRequests.push(request);
         request.onCompleteObservable.add(function (request) {
             _this._activeRequests.splice(_this._activeRequests.indexOf(request), 1);
@@ -42761,6 +42812,20 @@ var ThinEngine = /** @class */ (function () {
         return request;
     };
     /**
+     * Loads a file from a url
+     * @param url url to load
+     * @param onSuccess callback called when the file successfully loads
+     * @param onProgress callback called while file is loading (if the server supports this mode)
+     * @param offlineProvider defines the offline provider for caching
+     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
+     * @param onError callback called when the file fails to load
+     * @returns a file request object
+     * @hidden
+     */
+    ThinEngine._FileToolsLoadFile = function (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError) {
+        throw _Misc_devTools__WEBPACK_IMPORTED_MODULE_2__["_DevTools"].WarnImport("FileTools");
+    };
+    /**
      * Reads pixels from the current frame buffer. Please note that this function can be slow
      * @param x defines the x coordinate of the rectangle where pixels must be read
      * @param y defines the y coordinate of the rectangle where pixels must be read
@@ -42785,7 +42850,7 @@ var ThinEngine = /** @class */ (function () {
     ThinEngine.isSupported = function () {
         if (this._isSupported === null) {
             try {
-                var tempcanvas = _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_15__["CanvasGenerator"].CreateCanvas(1, 1);
+                var tempcanvas = _Misc_canvasGenerator__WEBPACK_IMPORTED_MODULE_14__["CanvasGenerator"].CreateCanvas(1, 1);
                 var gl = tempcanvas.getContext("webgl") || tempcanvas.getContext("experimental-webgl");
                 this._isSupported = gl != null && !!window.WebGLRenderingContext;
             }
@@ -47647,7 +47712,7 @@ var BoundingBoxGizmo = /** @class */ (function (_super) {
         this._dragMesh = _Meshes_mesh__WEBPACK_IMPORTED_MODULE_5__["Mesh"].CreateBox("dummy", 1, this.gizmoLayer.utilityLayerScene);
         this._dragMesh.visibility = 0;
         this._dragMesh.rotationQuaternion = new _Maths_math_vector__WEBPACK_IMPORTED_MODULE_3__["Quaternion"]();
-        this.pointerDragBehavior.useObjectOrienationForDragging = false;
+        this.pointerDragBehavior.useObjectOrientationForDragging = false;
         this._dragMesh.addBehavior(this.pointerDragBehavior);
     };
     /**
@@ -81982,6 +82047,8 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _Engines_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../Engines/constants */ "./Engines/constants.ts");
 /* harmony import */ var _Misc_guid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../Misc/guid */ "./Misc/guid.ts");
 /* harmony import */ var _Maths_math_size__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../Maths/math.size */ "./Maths/math.size.ts");
+/* harmony import */ var _Misc_fileTools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../Misc/fileTools */ "./Misc/fileTools.ts");
+
 
 
 
@@ -115515,7 +115582,10 @@ var InstancedMesh = /** @class */ (function (_super) {
         if (this._currentLOD && this._currentLOD.billboardMode !== _transformNode__WEBPACK_IMPORTED_MODULE_6__["TransformNode"].BILLBOARDMODE_NONE && this._currentLOD._masterMesh !== this) {
             var tempMaster = this._currentLOD._masterMesh;
             this._currentLOD._masterMesh = this;
+            _Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__["TmpVectors"].Vector3[7].copyFrom(this._currentLOD.position);
+            this._currentLOD.position.set(0, 0, 0);
             _Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__["TmpVectors"].Matrix[0].copyFrom(this._currentLOD.computeWorldMatrix(true));
+            this._currentLOD.position.copyFrom(_Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__["TmpVectors"].Vector3[7]);
             this._currentLOD._masterMesh = tempMaster;
             return _Maths_math_vector__WEBPACK_IMPORTED_MODULE_1__["TmpVectors"].Matrix[0];
         }
@@ -116128,7 +116198,7 @@ var Mesh = /** @class */ (function (_super) {
             ], ["_poseMatrix"]);
             // Source mesh
             _this._internalMeshDataInfo._source = source;
-            if (scene.useClonedMeshhMap) {
+            if (scene.useClonedMeshMap) {
                 if (!source._internalMeshDataInfo.meshMap) {
                     source._internalMeshDataInfo.meshMap = {};
                 }
@@ -117910,7 +117980,7 @@ var Mesh = /** @class */ (function (_super) {
             internalDataInfo._onAfterRenderObservable.clear();
         }
         // Sources
-        if (this._scene.useClonedMeshhMap) {
+        if (this._scene.useClonedMeshMap) {
             if (internalDataInfo.meshMap) {
                 for (var uniqueId in internalDataInfo.meshMap) {
                     var mesh = internalDataInfo.meshMap[uniqueId];
@@ -128882,6 +128952,10 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _retryStrategy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./retryStrategy */ "./Misc/retryStrategy.ts");
 /* harmony import */ var _baseError__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./baseError */ "./Misc/baseError.ts");
 /* harmony import */ var _stringTools__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringTools */ "./Misc/stringTools.ts");
+/* harmony import */ var _Engines_thinEngine__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Engines/thinEngine */ "./Engines/thinEngine.ts");
+/* harmony import */ var _Engines_Processors_shaderProcessor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Engines/Processors/shaderProcessor */ "./Engines/Processors/shaderProcessor.ts");
+
+
 
 
 
@@ -128974,12 +129048,12 @@ var FileTools = /** @class */ (function () {
         if (url && url.indexOf("data:") === 0) {
             return;
         }
-        if (this.CorsBehavior) {
-            if (typeof (this.CorsBehavior) === 'string' || this.CorsBehavior instanceof String) {
-                element.crossOrigin = this.CorsBehavior;
+        if (FileTools.CorsBehavior) {
+            if (typeof (FileTools.CorsBehavior) === 'string' || this.CorsBehavior instanceof String) {
+                element.crossOrigin = FileTools.CorsBehavior;
             }
             else {
-                var result = this.CorsBehavior(url);
+                var result = FileTools.CorsBehavior(url);
                 if (result) {
                     element.crossOrigin = result;
                 }
@@ -129012,11 +129086,11 @@ var FileTools = /** @class */ (function () {
             usingObjectURL = true;
         }
         else {
-            url = this._CleanUrl(input);
-            url = this.PreprocessUrl(input);
+            url = FileTools._CleanUrl(input);
+            url = FileTools.PreprocessUrl(input);
         }
         if (typeof Image === "undefined") {
-            this.LoadFile(url, function (data) {
+            FileTools.LoadFile(url, function (data) {
                 createImageBitmap(new Blob([data])).then(function (imgBmp) {
                     onLoad(imgBmp);
                     if (usingObjectURL) {
@@ -129035,7 +129109,7 @@ var FileTools = /** @class */ (function () {
             return null;
         }
         var img = new Image();
-        this.SetCorsBehavior(url, img);
+        FileTools.SetCorsBehavior(url, img);
         var loadHandler = function () {
             img.removeEventListener("load", loadHandler);
             img.removeEventListener("error", errorHandler);
@@ -129151,10 +129225,10 @@ var FileTools = /** @class */ (function () {
             }
             var file = _filesInputStore__WEBPACK_IMPORTED_MODULE_4__["FilesInputStore"].FilesToLoad[fileName];
             if (file) {
-                return this.ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? function (error) { return onError(undefined, new LoadFileError(error.message, error.file)); } : undefined);
+                return FileTools.ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? function (error) { return onError(undefined, new LoadFileError(error.message, error.file)); } : undefined);
             }
         }
-        return this.RequestFile(url, function (data, request) {
+        return FileTools.RequestFile(url, function (data, request) {
             onSuccess(data, request ? request.responseURL : undefined);
         }, onProgress, offlineProvider, useArrayBuffer, onError ? function (error) {
             onError(error.request, new LoadFileError(error.message, error.request));
@@ -129171,10 +129245,9 @@ var FileTools = /** @class */ (function () {
      * @returns a file request object
      */
     FileTools.RequestFile = function (url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError, onOpened) {
-        var _this = this;
-        url = this._CleanUrl(url);
-        url = this.PreprocessUrl(url);
-        var loadUrl = this.BaseUrl + url;
+        url = FileTools._CleanUrl(url);
+        url = FileTools.PreprocessUrl(url);
+        var loadUrl = FileTools.BaseUrl + url;
         var aborted = false;
         var fileRequest = {
             onCompleteObservable: new _observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](),
@@ -129218,11 +129291,11 @@ var FileTools = /** @class */ (function () {
                     if (request.readyState === (XMLHttpRequest.DONE || 4)) {
                         // Some browsers have issues where onreadystatechange can be called multiple times with the same value.
                         request.removeEventListener("readystatechange", onReadyStateChange);
-                        if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!_domManagement__WEBPACK_IMPORTED_MODULE_2__["DomManagement"].IsWindowObjectExist() || _this.IsFileURL()))) {
+                        if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!_domManagement__WEBPACK_IMPORTED_MODULE_2__["DomManagement"].IsWindowObjectExist() || FileTools.IsFileURL()))) {
                             onSuccess(useArrayBuffer ? request.response : request.responseText, request);
                             return;
                         }
-                        var retryStrategy = _this.DefaultRetryStrategy;
+                        var retryStrategy = FileTools.DefaultRetryStrategy;
                         if (retryStrategy) {
                             var waitTime = retryStrategy(loadUrl, request, retryIndex);
                             if (waitTime !== -1) {
@@ -129259,7 +129332,7 @@ var FileTools = /** @class */ (function () {
             var loadFromOfflineSupport = function () {
                 // TODO: database needs to support aborting and should return a IFileRequest
                 if (offlineProvider) {
-                    offlineProvider.loadFile(_this.BaseUrl + url, function (data) {
+                    offlineProvider.loadFile(FileTools.BaseUrl + url, function (data) {
                         if (!aborted) {
                             onSuccess(data);
                         }
@@ -129308,6 +129381,9 @@ var FileTools = /** @class */ (function () {
     return FileTools;
 }());
 
+_Engines_thinEngine__WEBPACK_IMPORTED_MODULE_8__["ThinEngine"]._FileToolsLoadImage = FileTools.LoadImage.bind(FileTools);
+_Engines_thinEngine__WEBPACK_IMPORTED_MODULE_8__["ThinEngine"]._FileToolsLoadFile = FileTools.LoadFile.bind(FileTools);
+_Engines_Processors_shaderProcessor__WEBPACK_IMPORTED_MODULE_9__["ShaderProcessor"]._FileToolsLoadFile = FileTools.LoadFile.bind(FileTools);
 
 
 /***/ }),
@@ -172641,8 +172717,9 @@ var Scene = /** @class */ (function (_super) {
             return _this._engine.getTimeStep();
         };
         _this._blockMaterialDirtyMechanism = false;
+        var fullOptions = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])({ useGeometryUniqueIdsMap: true, useMaterialMeshMap: true, useClonedMeshMap: true, virtual: false }, options);
         _this._engine = engine || _Engines_engineStore__WEBPACK_IMPORTED_MODULE_23__["EngineStore"].LastCreatedEngine;
-        if (!options || !options.virtual) {
+        if (!fullOptions.virtual) {
             _Engines_engineStore__WEBPACK_IMPORTED_MODULE_23__["EngineStore"]._LastCreatedScene = _this;
             _this._engine.scenes.push(_this);
         }
@@ -172661,11 +172738,11 @@ var Scene = /** @class */ (function (_super) {
             _this._imageProcessingConfiguration = new _Materials_imageProcessingConfiguration__WEBPACK_IMPORTED_MODULE_12__["ImageProcessingConfiguration"]();
         }
         _this.setDefaultCandidateProviders();
-        if (options && options.useGeometryUniqueIdsMap === true) {
+        if (fullOptions.useGeometryUniqueIdsMap) {
             _this.geometriesByUniqueId = {};
         }
-        _this.useMaterialMeshMap = options && options.useGeometryUniqueIdsMap || false;
-        _this.useClonedMeshhMap = options && options.useClonedMeshhMap || false;
+        _this.useMaterialMeshMap = fullOptions.useMaterialMeshMap;
+        _this.useClonedMeshMap = fullOptions.useClonedMeshMap;
         if (!options || !options.virtual) {
             _this._engine.onNewSceneAddedObservable.notifyObservers(_this);
         }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/babylon.max.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 115 - 6
dist/preview release/babylon.module.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 54 - 3
dist/preview release/documentation.d.ts


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

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

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

@@ -4,7 +4,7 @@
     },
     "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.",
-    "version": "4.1.0-beta.12",
+    "version": "4.1.0-beta.15",
     "repository": {
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,7 +28,7 @@
     ],
     "license": "Apache-2.0",
     "dependencies": {
-        "babylonjs": "4.1.0-beta.12"
+        "babylonjs": "4.1.0-beta.15"
     },
     "engines": {
         "node": "*"

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

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

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

@@ -4,7 +4,7 @@
     },
     "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.",
-    "version": "4.1.0-beta.12",
+    "version": "4.1.0-beta.15",
     "repository": {
         "type": "git",
         "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -28,8 +28,8 @@
     ],
     "license": "Apache-2.0",
     "dependencies": {
-        "babylonjs-gltf2interface": "4.1.0-beta.12",
-        "babylonjs": "4.1.0-beta.12"
+        "babylonjs-gltf2interface": "4.1.0-beta.15",
+        "babylonjs": "4.1.0-beta.15"
     },
     "engines": {
         "node": "*"

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

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

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

@@ -99,6 +99,7 @@ declare module NODEEDITOR {
 }
 declare module NODEEDITOR {
     export class GraphFrame {
+        private readonly CollapsedWidth;
         private static _FrameCounter;
         private _name;
         private _color;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.js


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

@@ -53939,6 +53939,7 @@ var GraphCanvasComponent = /** @class */ (function (_super) {
             this._frames.push(newFrame);
             this._frameCandidate.parentElement.removeChild(this._frameCandidate);
             this._frameCandidate = null;
+            this.props.globalState.onSelectionChangedObservable.notifyObservers(newFrame);
         }
     };
     GraphCanvasComponent.prototype.onWheel = function (evt) {
@@ -54098,6 +54099,7 @@ var GraphFrame = /** @class */ (function () {
     function GraphFrame(candidate, canvas, doNotCaptureNodes) {
         var _this = this;
         if (doNotCaptureNodes === void 0) { doNotCaptureNodes = false; }
+        this.CollapsedWidth = 200;
         this._x = 0;
         this._y = 0;
         this._gridAlignedX = 0;
@@ -54213,7 +54215,7 @@ var GraphFrame = /** @class */ (function () {
             // Need to delegate the outside ports to the frame
             if (value) {
                 this.element.classList.add("collapsed");
-                this._moveFrame((this.width - 200) / 2, 0);
+                this._moveFrame((this.width - this.CollapsedWidth) / 2, 0);
                 for (var _i = 0, _a = this._nodes; _i < _a.length; _i++) {
                     var node = _a[_i];
                     node.isVisible = false;
@@ -54280,7 +54282,7 @@ var GraphFrame = /** @class */ (function () {
                     var node = _l[_k];
                     node.isVisible = true;
                 }
-                this._moveFrame(-(this.width - 200) / 2, 0);
+                this._moveFrame(-(this.width - this.CollapsedWidth) / 2, 0);
             }
             this.cleanAccumulation();
             this._ownerCanvas._frameIsMoving = false;
@@ -54462,13 +54464,13 @@ var GraphFrame = /** @class */ (function () {
         this._ownerCanvas._frameIsMoving = false;
     };
     GraphFrame.prototype._moveFrame = function (offsetX, offsetY) {
+        this.x += offsetX;
+        this.y += offsetY;
         for (var _i = 0, _a = this._nodes; _i < _a.length; _i++) {
             var selectedNode = _a[_i];
             selectedNode.x += offsetX;
             selectedNode.y += offsetY;
         }
-        this.x += offsetX;
-        this.y += offsetY;
     };
     GraphFrame.prototype._onMove = function (evt) {
         if (this._mouseStartPointX === null || this._mouseStartPointY === null || evt.ctrlKey) {
@@ -54503,6 +54505,7 @@ var GraphFrame = /** @class */ (function () {
     };
     GraphFrame.Parse = function (serializationData, canvas, map) {
         var newFrame = new GraphFrame(null, canvas, true);
+        var isCollapsed = !!serializationData.isCollapsed;
         newFrame.x = serializationData.x;
         newFrame.y = serializationData.y;
         newFrame.width = serializationData.width;
@@ -54525,7 +54528,19 @@ var GraphFrame = /** @class */ (function () {
         else {
             newFrame.refresh();
         }
-        newFrame.isCollapsed = !!serializationData.isCollapsed;
+        newFrame.isCollapsed = isCollapsed;
+        if (isCollapsed) {
+            canvas._frameIsMoving = true;
+            newFrame._moveFrame(-(newFrame.width - newFrame.CollapsedWidth) / 2, 0);
+            var diff = serializationData.x - newFrame.x;
+            newFrame._moveFrame(diff, 0);
+            newFrame.cleanAccumulation();
+            for (var _b = 0, _c = newFrame.nodes; _b < _c.length; _b++) {
+                var selectedNode = _c[_b];
+                selectedNode.refresh();
+            }
+            canvas._frameIsMoving = false;
+        }
         return newFrame;
     };
     GraphFrame._FrameCounter = 0;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/nodeEditor/babylon.nodeEditor.max.js.map


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

@@ -174,6 +174,7 @@ declare module "babylonjs-node-editor/diagram/graphFrame" {
     import { IFrameData } from "babylonjs-node-editor/nodeLocationInfo";
     import { Color3 } from 'babylonjs/Maths/math.color';
     export class GraphFrame {
+        private readonly CollapsedWidth;
         private static _FrameCounter;
         private _name;
         private _color;
@@ -1587,6 +1588,7 @@ declare module NODEEDITOR {
 }
 declare module NODEEDITOR {
     export class GraphFrame {
+        private readonly CollapsedWidth;
         private static _FrameCounter;
         private _name;
         private _color;

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

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

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

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

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

@@ -1 +1 @@
-{"thinEngineOnly":119395,"engineOnly":156240,"sceneOnly":502047,"minGridMaterial":632428,"minStandardMaterial":756948}
+{"thinEngineOnly":112465,"engineOnly":149310,"sceneOnly":502580,"minGridMaterial":632959,"minStandardMaterial":757487}

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

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

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

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

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

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

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 115 - 6
dist/preview release/viewer/babylon.module.d.ts


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 10 - 10
dist/preview release/viewer/babylon.viewer.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
dist/preview release/viewer/babylon.viewer.max.js


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

@@ -265,8 +265,10 @@
 - Fixed an issue with pose input in webxr ([RaananW](https://github.com/RaananW/))
 - Fixed bug when parsing animation group without 'to' value ([noalak](https://github.com/noalak/))
 - isRightCamera and isLeftCamera were not set in WebXR ([RaananW](https://github.com/RaananW/))
-- Sandbox will now load assets relatively path-ed to same folder([Kyle Belfort](https://github.com/belfortk))
-- Playground will now render the returned scene from createScene() when there are multiple scenes added to engine([Kyle Belfort](https://github.com/belfortk))
+- Sandbox will now load assets relatively path-ed to same folder ([Kyle Belfort](https://github.com/belfortk))
+- Playground will now render the returned scene from createScene() when there are multiple scenes added to engine ([Kyle Belfort](https://github.com/belfortk))
+- Fixed bug so Playground will now download .env texture files to ./textures in .zip  ([Kyle Belfort](https://github.com/belfortk))
+- It was not possible to change the gaze and laser color in VR ([#7323](https://github.com/BabylonJS/Babylon.js/issues/7323)) ([RaananW](https://github.com/RaananW/))
 
 ## Breaking changes
 

+ 2 - 0
nodeEditor/src/diagram/graphCanvas.tsx

@@ -588,6 +588,8 @@ export class GraphCanvasComponent extends React.Component<IGraphCanvasComponentP
 
             this._frameCandidate.parentElement!.removeChild(this._frameCandidate);
             this._frameCandidate = null;
+
+            this.props.globalState.onSelectionChangedObservable.notifyObservers(newFrame);
          }
     }
 

+ 21 - 6
nodeEditor/src/diagram/graphFrame.ts

@@ -8,6 +8,7 @@ import { Color3 } from 'babylonjs/Maths/math.color';
 import { NodePort } from './nodePort';
 
 export class GraphFrame {
+    private readonly CollapsedWidth = 200;
     private static _FrameCounter = 0;
     private _name: string;
     private _color: Color3;
@@ -68,7 +69,7 @@ export class GraphFrame {
         if (value) {
             this.element.classList.add("collapsed");
                         
-            this._moveFrame((this.width - 200) / 2, 0);
+            this._moveFrame((this.width - this.CollapsedWidth) / 2, 0);
 
             for (var node of this._nodes) {
                 node.isVisible = false;
@@ -135,7 +136,7 @@ export class GraphFrame {
                 node.isVisible = true;
             }
                         
-            this._moveFrame(-(this.width - 200) / 2, 0);
+            this._moveFrame(-(this.width - this.CollapsedWidth) / 2, 0);
         }
 
         this.cleanAccumulation();
@@ -416,13 +417,13 @@ export class GraphFrame {
     }
 
     private _moveFrame(offsetX: number, offsetY: number) {
+        this.x += offsetX;
+        this.y += offsetY;
+
         for (var selectedNode of this._nodes) {
             selectedNode.x += offsetX;
             selectedNode.y += offsetY;
         }
-
-        this.x += offsetX;
-        this.y += offsetY;
     }
 
     private _onMove(evt: PointerEvent) {
@@ -469,6 +470,7 @@ export class GraphFrame {
 
     public static Parse(serializationData: IFrameData, canvas: GraphCanvasComponent, map?: {[key: number]: number}) {
         let newFrame = new GraphFrame(null, canvas, true);
+        const isCollapsed = !!serializationData.isCollapsed;
 
         newFrame.x = serializationData.x;
         newFrame.y = serializationData.y;
@@ -490,7 +492,20 @@ export class GraphFrame {
             newFrame.refresh();
         }
 
-        newFrame.isCollapsed = !!serializationData.isCollapsed;
+        newFrame.isCollapsed = isCollapsed;
+
+        if (isCollapsed) {
+            canvas._frameIsMoving = true;
+            newFrame._moveFrame(-(newFrame.width - newFrame.CollapsedWidth) / 2, 0);
+            let diff = serializationData.x - newFrame.x;
+            newFrame._moveFrame(diff, 0);
+            newFrame.cleanAccumulation();
+            
+            for (var selectedNode of newFrame.nodes) {
+                selectedNode.refresh();
+            }
+            canvas._frameIsMoving = false;
+        }
 
         return newFrame;
     }

+ 1 - 1
package.json

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

+ 5 - 5
src/Behaviors/Meshes/pointerDragBehavior.ts

@@ -95,7 +95,7 @@ export class PointerDragBehavior implements Behavior<AbstractMesh> {
     /**
      * If set, the drag plane/axis will be rotated based on the attached mesh's world rotation (Default: true)
      */
-    public useObjectOrienationForDragging = true;
+    public useObjectOrientationForDragging = true;
 
     private _options: { dragAxis?: Vector3, dragPlaneNormal?: Vector3 };
 
@@ -330,8 +330,8 @@ export class PointerDragBehavior implements Behavior<AbstractMesh> {
             var dragLength = 0;
             // depending on the drag mode option drag accordingly
             if (this._options.dragAxis) {
-                // Convert local drag axis to world if useObjectOrienationForDragging
-                this.useObjectOrienationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis);
+                // Convert local drag axis to world if useObjectOrientationForDragging
+                this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._worldDragAxis) : this._worldDragAxis.copyFrom(this._options.dragAxis);
 
                 // Project delta drag from the drag plane onto the drag axis
                 pickedPoint.subtractToRef(this.lastDragPosition, this._tmpVector);
@@ -400,7 +400,7 @@ export class PointerDragBehavior implements Behavior<AbstractMesh> {
     private _updateDragPlanePosition(ray: Ray, dragPlanePosition: Vector3) {
         this._pointA.copyFrom(dragPlanePosition);
         if (this._options.dragAxis) {
-            this.useObjectOrienationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis);
+            this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragAxis, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragAxis);
 
             // Calculate plane normal in direction of camera but perpendicular to drag axis
             this._pointA.addToRef(this._localAxis, this._pointB); // towards drag axis
@@ -418,7 +418,7 @@ export class PointerDragBehavior implements Behavior<AbstractMesh> {
             this._pointA.addToRef(this._lookAt, this._lookAt);
             this._dragPlane.lookAt(this._lookAt);
         } else if (this._options.dragPlaneNormal) {
-            this.useObjectOrienationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal);
+            this.useObjectOrientationForDragging ? Vector3.TransformCoordinatesToRef(this._options.dragPlaneNormal, this.attachedNode.getWorldMatrix().getRotationMatrix(), this._localAxis) : this._localAxis.copyFrom(this._options.dragPlaneNormal);
             this._dragPlane.position.copyFrom(this._pointA);
             this._pointA.addToRef(this._localAxis, this._lookAt);
             this._dragPlane.lookAt(this._lookAt);

+ 33 - 8
src/Cameras/VR/vrExperienceHelper.ts

@@ -429,6 +429,11 @@ export class VRExperienceHelper {
     private _leftController: Nullable<VRExperienceHelperControllerGazer> = null;
     private _rightController: Nullable<VRExperienceHelperControllerGazer> = null;
 
+    private _gazeColor: Color3 = new Color3(0.7, 0.7, 0.7);
+    private _laserColor: Color3 = new Color3(0.7, 0.7, 0.7);
+    private _pickedLaserColor: Color3 = new Color3(0.2, 0.2, 1);
+    private _pickedGazeColor: Color3 = new Color3(0, 0, 1);
+
     /**
      * Observable raised when a new mesh is selected based on meshSelectionPredicate
      */
@@ -2193,13 +2198,13 @@ export class VRExperienceHelper {
                     this.onNewMeshPicked.notifyObservers(hit);
                     gazer._currentMeshSelected = hit.pickedMesh;
                     if (hit.pickedMesh.isPickable && hit.pickedMesh.actionManager) {
-                        this.changeGazeColor(new Color3(0, 0, 1));
-                        this.changeLaserColor(new Color3(0.2, 0.2, 1));
+                        this.changeGazeColor(this._pickedGazeColor);
+                        this.changeLaserColor(this._pickedLaserColor);
                         gazer._isActionableMesh = true;
                     }
                     else {
-                        this.changeGazeColor(new Color3(0.7, 0.7, 0.7));
-                        this.changeLaserColor(new Color3(0.7, 0.7, 0.7));
+                        this.changeGazeColor(this._gazeColor);
+                        this.changeLaserColor(this._laserColor);
                         gazer._isActionableMesh = false;
                     }
                     try {
@@ -2216,8 +2221,8 @@ export class VRExperienceHelper {
                 else {
                     this._notifySelectedMeshUnselected(gazer._currentMeshSelected);
                     gazer._currentMeshSelected = null;
-                    this.changeGazeColor(new Color3(0.7, 0.7, 0.7));
-                    this.changeLaserColor(new Color3(0.7, 0.7, 0.7));
+                    this.changeGazeColor(this._gazeColor);
+                    this.changeLaserColor(this._laserColor);
                 }
             }
         }
@@ -2225,8 +2230,8 @@ export class VRExperienceHelper {
             this._notifySelectedMeshUnselected(gazer._currentMeshSelected);
             gazer._currentMeshSelected = null;
             //this._teleportationAllowed = false;
-            this.changeGazeColor(new Color3(0.7, 0.7, 0.7));
-            this.changeLaserColor(new Color3(0.7, 0.7, 0.7));
+            this.changeGazeColor(this._gazeColor);
+            this.changeLaserColor(this._laserColor);
         }
     }
 
@@ -2237,6 +2242,26 @@ export class VRExperienceHelper {
     }
 
     /**
+     * Permanently set new colors for the laser pointer
+     * @param color the new laser color
+     * @param pickedColor the new laser color when picked mesh detected
+     */
+    public setLaserColor(color: Color3, pickedColor: Color3 = this._pickedLaserColor) {
+        this._laserColor = color;
+        this._pickedLaserColor = pickedColor;
+    }
+
+    /**
+     * Permanently set new colors for the gaze pointer
+     * @param color the new gaze color
+     * @param pickedColor the new gaze color when picked mesh detected
+     */
+    public setGazeColor(color: Color3, pickedColor: Color3 = this._pickedGazeColor) {
+        this._gazeColor = color;
+        this._pickedGazeColor = pickedColor;
+    }
+
+    /**
      * Sets the color of the laser ray from the vr controllers.
      * @param color new color for the ray.
      */

+ 22 - 2
src/Engines/Processors/shaderProcessor.ts

@@ -8,7 +8,12 @@ import { ShaderDefineAndOperator } from './Expressions/Operators/shaderDefineAnd
 import { ShaderDefineExpression } from './Expressions/shaderDefineExpression';
 import { ShaderDefineArithmeticOperator } from './Expressions/Operators/shaderDefineArithmeticOperator';
 import { ProcessingOptions } from './shaderProcessingOptions';
-import { FileTools } from '../../Misc/fileTools';
+import { _DevTools } from '../../Misc/devTools';
+
+declare type WebRequest = import("../../Misc/webRequest").WebRequest;
+declare type LoadFileError = import("../../Misc/fileTools").LoadFileError;
+declare type IOfflineProvider = import("../../Offline/IOfflineProvider").IOfflineProvider;
+declare type IFileRequest  = import("../../Misc/fileRequest").IFileRequest;
 
 /** @hidden */
 export class ShaderProcessor {
@@ -331,7 +336,7 @@ export class ShaderProcessor {
             } else {
                 var includeShaderUrl = options.shadersRepository + "ShadersInclude/" + includeFile + ".fx";
 
-                FileTools.LoadFile(includeShaderUrl, (fileContent) => {
+                ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => {
                     options.includesShadersStore[includeFile] = fileContent as string;
                     this._ProcessIncludes(<string>returnValue, options, callback);
                 });
@@ -343,4 +348,19 @@ export class ShaderProcessor {
 
         callback(returnValue);
     }
+
+    /**
+     * Loads a file from a url
+     * @param url url to load
+     * @param onSuccess callback called when the file successfully loads
+     * @param onProgress callback called while file is loading (if the server supports this mode)
+     * @param offlineProvider defines the offline provider for caching
+     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
+     * @param onError callback called when the file fails to load
+     * @returns a file request object
+     * @hidden
+     */
+    public static _FileToolsLoadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void): IFileRequest {
+        throw  _DevTools.WarnImport("FileTools");
+    }
 }

+ 40 - 8
src/Engines/thinEngine.ts

@@ -23,13 +23,14 @@ import { IPipelineContext } from './IPipelineContext';
 import { WebGLPipelineContext } from './WebGL/webGLPipelineContext';
 import { VertexBuffer } from '../Meshes/buffer';
 import { InstancingAttributeInfo } from './instancingAttributeInfo';
-import { FileTools } from '../Misc/fileTools';
 import { BaseTexture } from '../Materials/Textures/baseTexture';
 import { IOfflineProvider } from '../Offline/IOfflineProvider';
 import { IEffectFallbacks } from '../Materials/iEffectFallbacks';
 import { IWebRequest } from '../Misc/interfaces/iWebRequest';
 import { CanvasGenerator } from '../Misc/canvasGenerator';
 
+declare type WebRequest = import("../Misc/webRequest").WebRequest;
+declare type LoadFileError = import("../Misc/fileTools").LoadFileError;
 declare type Observer<T> = import("../Misc/observable").Observer<T>;
 declare type VideoTexture = import("../Materials/Textures/videoTexture").VideoTexture;
 declare type RenderTargetTexture = import("../Materials/Textures/renderTargetTexture").RenderTargetTexture;
@@ -131,14 +132,14 @@ export class ThinEngine {
      */
     // Not mixed with Version for tooling purpose.
     public static get NpmPackage(): string {
-        return "babylonjs@4.1.0-beta.12";
+        return "babylonjs@4.1.0-beta.15";
     }
 
     /**
      * Returns the current version of the framework
      */
     public static get Version(): string {
-        return "4.1.0-beta.12";
+        return "4.1.0-beta.15";
     }
 
     /**
@@ -624,7 +625,7 @@ export class ThinEngine {
                     if (this._gl) {
                         this._webGLVersion = 2.0;
 
-                        // Prevent weird browsers to lie :-)
+                        // Prevent weird browsers to lie
                         if (!this._gl.deleteQuery) {
                             this._webGLVersion = 1.0;
                         }
@@ -2952,11 +2953,11 @@ export class ThinEngine {
                 if (buffer && ((<HTMLImageElement>buffer).decoding || (<ImageBitmap>buffer).close)) {
                     onload(<HTMLImageElement>buffer);
                 } else {
-                    FileTools.LoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
+                    ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
                 }
             }
             else if (typeof buffer === "string" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {
-                FileTools.LoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
+                ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);
             }
             else if (buffer) {
                 onload(<HTMLImageElement>buffer);
@@ -2967,6 +2968,20 @@ export class ThinEngine {
     }
 
     /**
+     * Loads an image as an HTMLImageElement.
+     * @param input url string, ArrayBuffer, or Blob to load
+     * @param onLoad callback called when the image successfully loads
+     * @param onError callback called when the image fails to load
+     * @param offlineProvider offline provider for caching
+     * @param mimeType optional mime type
+     * @returns the HTMLImageElement of the loaded image
+     * @hidden
+     */
+    public static _FileToolsLoadImage(input: string | ArrayBuffer | ArrayBufferView | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string): Nullable<HTMLImageElement> {
+        throw _DevTools.WarnImport("FileTools");
+    }
+
+    /**
      * @hidden
      */
     public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable<any>, internalFormat: number, onComplete: () => void): void {
@@ -3181,7 +3196,7 @@ export class ThinEngine {
 
         var textureType = this._getWebGLTextureType(texture.type);
         var format = this._getInternalFormat(texture.format);
-        var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, format) : this._getInternalFormat(babylonInternalFormat);
+        var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format) : this._getInternalFormat(babylonInternalFormat);
 
         this._unpackFlipY(texture.invertY);
 
@@ -3998,6 +4013,8 @@ export class ThinEngine {
                         return this._gl.LUMINANCE;
                     case Constants.TEXTUREFORMAT_LUMINANCE_ALPHA:
                         return this._gl.LUMINANCE_ALPHA;
+                    case Constants.TEXTUREFORMAT_RGB:
+                        return this._gl.RGB;
                 }
             }
             return this._gl.RGBA;
@@ -4167,7 +4184,7 @@ export class ThinEngine {
     /** @hidden */
     public _loadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (data: any) => void,
         offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: IWebRequest, exception?: any) => void): IFileRequest {
-        let request = FileTools.LoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);
+        let request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);
         this._activeRequests.push(request);
         request.onCompleteObservable.add((request) => {
             this._activeRequests.splice(this._activeRequests.indexOf(request), 1);
@@ -4176,6 +4193,21 @@ export class ThinEngine {
     }
 
     /**
+     * Loads a file from a url
+     * @param url url to load
+     * @param onSuccess callback called when the file successfully loads
+     * @param onProgress callback called while file is loading (if the server supports this mode)
+     * @param offlineProvider defines the offline provider for caching
+     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
+     * @param onError callback called when the file fails to load
+     * @returns a file request object
+     * @hidden
+     */
+    public static _FileToolsLoadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void): IFileRequest {
+        throw  _DevTools.WarnImport("FileTools");
+    }
+
+    /**
      * Reads pixels from the current frame buffer. Please note that this function can be slow
      * @param x defines the x coordinate of the rectangle where pixels must be read
      * @param y defines the y coordinate of the rectangle where pixels must be read

+ 1 - 1
src/Gizmos/boundingBoxGizmo.ts

@@ -549,7 +549,7 @@ export class BoundingBoxGizmo extends Gizmo {
         this._dragMesh = Mesh.CreateBox("dummy", 1, this.gizmoLayer.utilityLayerScene);
         this._dragMesh.visibility = 0;
         this._dragMesh.rotationQuaternion = new Quaternion();
-        this.pointerDragBehavior.useObjectOrienationForDragging = false;
+        this.pointerDragBehavior.useObjectOrientationForDragging = false;
         this._dragMesh.addBehavior(this.pointerDragBehavior);
     }
 

+ 2 - 0
src/Materials/Textures/baseTexture.ts

@@ -11,6 +11,8 @@ import { IAnimatable } from '../../Animations/animatable.interface';
 import { GUID } from '../../Misc/guid';
 import { ISize, Size } from '../../Maths/math.size';
 
+import "../../Misc/fileTools";
+
 declare type Animation = import("../../Animations/animation").Animation;
 
 /**

+ 8 - 3
src/Materials/Textures/cubeTexture.ts

@@ -253,8 +253,9 @@ export class CubeTexture extends BaseTexture {
      * @param url the url of the texture
      * @param forcedExtension defines the extension to use
      * @param onLoad callback called when the texture is loaded  (defaults to null)
+     * @param prefiltered Defines whether the updated texture is prefiltered or not
      */
-    public updateURL(url: string, forcedExtension?: string, onLoad?: () => void): void {
+    public updateURL(url: string, forcedExtension?: string, onLoad?: () => void, prefiltered: boolean = false): void {
         if (this.url) {
             this.releaseInternalTexture();
             this.getScene()!.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);
@@ -265,7 +266,11 @@ export class CubeTexture extends BaseTexture {
         }
         this.url = url;
         this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;
-        this._prefiltered = false;
+        this._prefiltered = prefiltered;
+        if (this._prefiltered) {
+            this.gammaSpace = false;
+            this.anisotropicFilteringLevel = 1;
+        }
         this._forcedExtension = forcedExtension || null;
 
         if (onLoad) {
@@ -294,7 +299,7 @@ export class CubeTexture extends BaseTexture {
 
         if (!this._texture) {
             if (this._prefiltered) {
-                this._texture = scene.getEngine().createPrefilteredCubeTexture(this.url, scene, this.lodGenerationScale, this.lodGenerationOffset, this._delayedOnLoad, undefined, this._format, undefined, this._createPolynomials);
+                this._texture = scene.getEngine().createPrefilteredCubeTexture(this.url, scene, 0.8, 0, this._delayedOnLoad, undefined, this._format, undefined, this._createPolynomials);
             }
             else {
                 this._texture = scene.getEngine().createCubeTexture(this.url, scene, this._files, this._noMipmap, this._delayedOnLoad, null, this._format, forcedExtension);

+ 3 - 0
src/Meshes/instancedMesh.ts

@@ -332,7 +332,10 @@ export class InstancedMesh extends AbstractMesh {
         if (this._currentLOD && this._currentLOD.billboardMode !== TransformNode.BILLBOARDMODE_NONE && this._currentLOD._masterMesh !== this) {
             let tempMaster = this._currentLOD._masterMesh;
             this._currentLOD._masterMesh = this;
+            TmpVectors.Vector3[7].copyFrom(this._currentLOD.position);
+            this._currentLOD.position.set(0, 0, 0);
             TmpVectors.Matrix[0].copyFrom(this._currentLOD.computeWorldMatrix(true));
+            this._currentLOD.position.copyFrom(TmpVectors.Vector3[7]);
             this._currentLOD._masterMesh = tempMaster;
             return TmpVectors.Matrix[0];
         }

+ 2 - 2
src/Meshes/mesh.ts

@@ -417,7 +417,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
 
             // Source mesh
             this._internalMeshDataInfo._source = source;
-            if (scene.useClonedMeshhMap) {
+            if (scene.useClonedMeshMap) {
                 if (!source._internalMeshDataInfo.meshMap) {
                     source._internalMeshDataInfo.meshMap = {};
                 }
@@ -2236,7 +2236,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
         }
 
         // Sources
-        if (this._scene.useClonedMeshhMap) {
+        if (this._scene.useClonedMeshMap) {
             if (internalDataInfo.meshMap) {
                 for (const uniqueId in internalDataInfo.meshMap) {
                     const mesh = internalDataInfo.meshMap[uniqueId];

+ 23 - 17
src/Misc/fileTools.ts

@@ -8,6 +8,8 @@ import { FilesInputStore } from './filesInputStore';
 import { RetryStrategy } from './retryStrategy';
 import { BaseError } from './baseError';
 import { StringTools } from './stringTools';
+import { ThinEngine } from '../Engines/thinEngine';
+import { ShaderProcessor } from '../Engines/Processors/shaderProcessor';
 
 /** @ignore */
 export class LoadFileError extends BaseError {
@@ -110,12 +112,12 @@ export class FileTools {
             return;
         }
 
-        if (this.CorsBehavior) {
-            if (typeof (this.CorsBehavior) === 'string' || this.CorsBehavior instanceof String) {
-                element.crossOrigin = <string>this.CorsBehavior;
+        if (FileTools.CorsBehavior) {
+            if (typeof (FileTools.CorsBehavior) === 'string' || this.CorsBehavior instanceof String) {
+                element.crossOrigin = <string>FileTools.CorsBehavior;
             }
             else {
-                var result = this.CorsBehavior(url);
+                var result = FileTools.CorsBehavior(url);
                 if (result) {
                     element.crossOrigin = result;
                 }
@@ -149,12 +151,12 @@ export class FileTools {
             usingObjectURL = true;
         }
         else {
-            url = this._CleanUrl(input);
-            url = this.PreprocessUrl(input);
+            url = FileTools._CleanUrl(input);
+            url = FileTools.PreprocessUrl(input);
         }
 
         if (typeof Image === "undefined") {
-            this.LoadFile(url, (data) => {
+            FileTools.LoadFile(url, (data) => {
                 createImageBitmap(new Blob([data])).then((imgBmp) => {
                     onLoad(imgBmp);
                     if (usingObjectURL) {
@@ -175,7 +177,7 @@ export class FileTools {
         }
 
         var img = new Image();
-        this.SetCorsBehavior(url, img);
+        FileTools.SetCorsBehavior(url, img);
 
         const loadHandler = () => {
             img.removeEventListener("load", loadHandler);
@@ -307,11 +309,11 @@ export class FileTools {
             }
             const file = FilesInputStore.FilesToLoad[fileName];
             if (file) {
-                return this.ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);
+                return FileTools.ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);
             }
         }
 
-        return this.RequestFile(url, (data, request) => {
+        return FileTools.RequestFile(url, (data, request) => {
             onSuccess(data, request ? request.responseURL : undefined);
         }, onProgress, offlineProvider, useArrayBuffer, onError ? (error) => {
             onError(error.request, new LoadFileError(error.message, error.request));
@@ -329,10 +331,10 @@ export class FileTools {
      * @returns a file request object
      */
     public static RequestFile(url: string, onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void, onProgress?: (event: ProgressEvent) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (error: RequestFileError) => void, onOpened?: (request: WebRequest) => void): IFileRequest {
-        url = this._CleanUrl(url);
-        url = this.PreprocessUrl(url);
+        url = FileTools._CleanUrl(url);
+        url = FileTools.PreprocessUrl(url);
 
-        const loadUrl = this.BaseUrl + url;
+        const loadUrl = FileTools.BaseUrl + url;
 
         let aborted = false;
         const fileRequest: IFileRequest = {
@@ -390,12 +392,12 @@ export class FileTools {
                         // Some browsers have issues where onreadystatechange can be called multiple times with the same value.
                         request.removeEventListener("readystatechange", onReadyStateChange);
 
-                        if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!DomManagement.IsWindowObjectExist() || this.IsFileURL()))) {
+                        if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!DomManagement.IsWindowObjectExist() || FileTools.IsFileURL()))) {
                             onSuccess(useArrayBuffer ? request.response : request.responseText, request);
                             return;
                         }
 
-                        let retryStrategy = this.DefaultRetryStrategy;
+                        let retryStrategy = FileTools.DefaultRetryStrategy;
                         if (retryStrategy) {
                             let waitTime = retryStrategy(loadUrl, request, retryIndex);
                             if (waitTime !== -1) {
@@ -438,7 +440,7 @@ export class FileTools {
                 // TODO: database needs to support aborting and should return a IFileRequest
 
                 if (offlineProvider) {
-                    offlineProvider.loadFile(this.BaseUrl + url, (data) => {
+                    offlineProvider.loadFile(FileTools.BaseUrl + url, (data) => {
                         if (!aborted) {
                             onSuccess(data);
                         }
@@ -468,4 +470,8 @@ export class FileTools {
     public static IsFileURL(): boolean {
         return location.protocol === "file:";
     }
-}
+}
+
+ThinEngine._FileToolsLoadImage = FileTools.LoadImage.bind(FileTools);
+ThinEngine._FileToolsLoadFile = FileTools.LoadFile.bind(FileTools);
+ShaderProcessor._FileToolsLoadFile = FileTools.LoadFile.bind(FileTools);

+ 15 - 6
src/scene.ts

@@ -92,7 +92,7 @@ export interface SceneOptions {
      * Defines that each mesh of the scene should keep up-to-date a map of referencing cloned meshes for fast diposing
      * It will improve performance when the number of mesh becomes important, but might consume a bit more memory
      */
-    useClonedMeshhMap?: boolean;
+    useClonedMeshMap?: boolean;
 
     /** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */
     virtual?: boolean;
@@ -1186,7 +1186,7 @@ export class Scene extends AbstractScene implements IAnimatable {
     /** @hidden */
     public readonly useMaterialMeshMap: boolean;
     /** @hidden */
-    public readonly useClonedMeshhMap: boolean;
+    public readonly useClonedMeshMap: boolean;
 
     private _externalData: StringDictionary<Object>;
     private _uid: Nullable<string>;
@@ -1371,8 +1371,17 @@ export class Scene extends AbstractScene implements IAnimatable {
      */
     constructor(engine: Engine, options?: SceneOptions) {
         super();
+
+        const fullOptions = {
+            useGeometryUniqueIdsMap: true,
+            useMaterialMeshMap: true,
+            useClonedMeshMap: true,
+            virtual: false,
+            ...options
+        };
+
         this._engine = engine || EngineStore.LastCreatedEngine;
-        if (!options || !options.virtual) {
+        if (!fullOptions.virtual) {
             EngineStore._LastCreatedScene = this;
             this._engine.scenes.push(this);
         }
@@ -1399,12 +1408,12 @@ export class Scene extends AbstractScene implements IAnimatable {
 
         this.setDefaultCandidateProviders();
 
-        if (options && options.useGeometryUniqueIdsMap === true) {
+        if (fullOptions.useGeometryUniqueIdsMap) {
             this.geometriesByUniqueId = {};
         }
 
-        this.useMaterialMeshMap = options && options.useGeometryUniqueIdsMap || false;
-        this.useClonedMeshhMap = options && options.useClonedMeshhMap || false;
+        this.useMaterialMeshMap = fullOptions.useMaterialMeshMap;
+        this.useClonedMeshMap = fullOptions.useClonedMeshMap;
 
         if (!options || !options.virtual) {
             this._engine.onNewSceneAddedObservable.notifyObservers(this);