Explorar o código

Merge branch 'master' into sceneAssetContainer

Trevor Baron %!s(int64=7) %!d(string=hai) anos
pai
achega
ab1c0b93aa
Modificáronse 31 ficheiros con 22313 adicións e 22236 borrados
  1. 7442 7442
      Playground/babylon.d.txt
  2. 3 2
      Tools/Gulp/gulpfile.js
  3. 1 1
      Tools/Gulp/package.json
  4. 7733 7733
      dist/preview release/babylon.d.ts
  5. 23 23
      dist/preview release/babylon.js
  6. 13 5
      dist/preview release/babylon.max.js
  7. 23 23
      dist/preview release/babylon.worker.js
  8. 6841 6841
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts
  9. 25 25
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js
  10. 18 6
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js
  11. 1 0
      dist/preview release/loaders/babylon.glTF2FileLoader.d.ts
  12. 5 1
      dist/preview release/loaders/babylon.glTF2FileLoader.js
  13. 2 2
      dist/preview release/loaders/babylon.glTF2FileLoader.min.js
  14. 1 0
      dist/preview release/loaders/babylon.glTFFileLoader.d.ts
  15. 5 1
      dist/preview release/loaders/babylon.glTFFileLoader.js
  16. 2 2
      dist/preview release/loaders/babylon.glTFFileLoader.min.js
  17. 5 1
      dist/preview release/loaders/babylonjs.loaders.js
  18. 2 2
      dist/preview release/loaders/babylonjs.loaders.min.js
  19. 1 0
      dist/preview release/loaders/babylonjs.loaders.module.d.ts
  20. 38 38
      dist/preview release/viewer/babylon.viewer.js
  21. BIN=BIN
      favicon.ico
  22. 6 3
      loaders/src/glTF/2.0/babylon.glTFLoader.ts
  23. 1 0
      loaders/src/glTF/2.0/babylon.glTFLoaderInterfaces.ts
  24. 3 1
      readme.md
  25. 0 5
      src/Lights/babylon.light.ts
  26. 5 1
      src/Mesh/babylon.meshBuilder.ts
  27. 13 0
      src/babylon.scene.ts
  28. 9 2
      tests/validation/integration.js
  29. 89 0
      tests/validation/karma.conf.browserstack.js
  30. 0 74
      tests/validation/karma.conf.saucelabs.js
  31. 3 2
      tests/validation/validation.js

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 7442 - 7442
Playground/babylon.d.txt


+ 3 - 2
Tools/Gulp/gulpfile.js

@@ -420,6 +420,7 @@ var buildExternalLibrary = function (library, settings, watch) {
  * The default task, concat and min the main BJS files.
  */
 gulp.task("default", function (cb) {
+    // runSequence("typescript-all", "intellisense", "tests-browserStack", cb);
     runSequence("typescript-all", "intellisense", cb);
 });
 
@@ -570,14 +571,14 @@ gulp.task("tests-integration", function (done) {
     server.start();
 });
 
-gulp.task("tests-saucelabs", function (done) {
+gulp.task("tests-browserStack", function (done) {
     if (!process.env.TRAVIS) {
         done();
         return;
     }
 
     var kamaServerOptions = {
-        configFile: __dirname + "/../../tests/validation/karma.conf.saucelabs.js",
+        configFile: __dirname + "/../../tests/validation/karma.conf.browserstack.js",
         singleRun: true
     };
 

+ 1 - 1
Tools/Gulp/package.json

@@ -46,7 +46,7 @@
         "webpack-stream": "^4.0.0",
         "karma": "^2.0.0",
         "karma-chrome-launcher": "^2.2.0",
-        "karma-sauce-launcher": "^1.2.0",
+        "karma-browserstack-launcher": "^1.3.0",
         "mocha": "^4.0.1",
         "chai": "^4.1.2",
         "sinon": "^4.1.3",

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 7733 - 7733
dist/preview release/babylon.d.ts


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 23 - 23
dist/preview release/babylon.js


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

@@ -16570,11 +16570,6 @@ var BABYLON;
             }
             // Animations
             this.getScene().stopAnimation(this);
-            // Remove from meshes
-            for (var _i = 0, _a = this.getScene().meshes; _i < _a.length; _i++) {
-                var mesh = _a[_i];
-                mesh._removeLightSource(this);
-            }
             this._uniformBuffer.dispose();
             // Remove from scene
             this.getScene().removeLight(this);
@@ -20255,6 +20250,11 @@ var BABYLON;
         Scene.prototype.removeLight = function (toRemove) {
             var index = this.lights.indexOf(toRemove);
             if (index !== -1) {
+                // Remove from meshes
+                for (var _i = 0, _a = this.meshes; _i < _a.length; _i++) {
+                    var mesh = _a[_i];
+                    mesh._removeLightSource(toRemove);
+                }
                 // Remove from the scene if mesh found
                 this.lights.splice(index, 1);
                 this.sortLightsByPriority();
@@ -20289,6 +20289,14 @@ var BABYLON;
         Scene.prototype.addLight = function (newLight) {
             this.lights.push(newLight);
             this.sortLightsByPriority();
+            // Add light to all meshes (To support if the light is removed and then readded)
+            for (var _i = 0, _a = this.meshes; _i < _a.length; _i++) {
+                var mesh = _a[_i];
+                if (mesh._lightSources.indexOf(newLight) === -1) {
+                    mesh._lightSources.push(newLight);
+                    mesh._resyncLightSources();
+                }
+            }
             this.onNewLightAddedObservable.notifyObservers(newLight);
         };
         Scene.prototype.sortLightsByPriority = function () {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 23 - 23
dist/preview release/babylon.worker.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 6841 - 6841
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 25 - 25
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 18 - 6
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -16570,11 +16570,6 @@ var BABYLON;
             }
             // Animations
             this.getScene().stopAnimation(this);
-            // Remove from meshes
-            for (var _i = 0, _a = this.getScene().meshes; _i < _a.length; _i++) {
-                var mesh = _a[_i];
-                mesh._removeLightSource(this);
-            }
             this._uniformBuffer.dispose();
             // Remove from scene
             this.getScene().removeLight(this);
@@ -20255,6 +20250,11 @@ var BABYLON;
         Scene.prototype.removeLight = function (toRemove) {
             var index = this.lights.indexOf(toRemove);
             if (index !== -1) {
+                // Remove from meshes
+                for (var _i = 0, _a = this.meshes; _i < _a.length; _i++) {
+                    var mesh = _a[_i];
+                    mesh._removeLightSource(toRemove);
+                }
                 // Remove from the scene if mesh found
                 this.lights.splice(index, 1);
                 this.sortLightsByPriority();
@@ -20289,6 +20289,14 @@ var BABYLON;
         Scene.prototype.addLight = function (newLight) {
             this.lights.push(newLight);
             this.sortLightsByPriority();
+            // Add light to all meshes (To support if the light is removed and then readded)
+            for (var _i = 0, _a = this.meshes; _i < _a.length; _i++) {
+                var mesh = _a[_i];
+                if (mesh._lightSources.indexOf(newLight) === -1) {
+                    mesh._lightSources.push(newLight);
+                    mesh._resyncLightSources();
+                }
+            }
             this.onNewLightAddedObservable.notifyObservers(newLight);
         };
         Scene.prototype.sortLightsByPriority = function () {
@@ -84302,7 +84310,6 @@ var BABYLON;
                     return;
                 }
                 node.babylonMesh = new BABYLON.Mesh(node.name || "mesh" + node.index, this._babylonScene);
-                node.babylonMesh.hasVertexAlpha = true;
                 this._loadTransform(node);
                 if (node.mesh != null) {
                     var mesh = GLTFLoader._GetProperty(this._gltf.meshes, node.mesh);
@@ -84357,6 +84364,7 @@ var BABYLON;
                         var primitive = primitives_1[_i];
                         vertexData.merge(primitive.vertexData);
                     }
+                    node.babylonMesh.hasVertexAlpha = mesh.hasVertexAlpha;
                     new BABYLON.Geometry(node.babylonMesh.name, _this._babylonScene, vertexData, false, node.babylonMesh);
                     // TODO: optimize this so that sub meshes can be created without being overwritten after setting vertex data.
                     // Sub meshes must be cleared and created after setting vertex data because of mesh._createGlobalSubMesh.
@@ -84565,6 +84573,10 @@ var BABYLON;
                             }
                             case "COLOR_0": {
                                 vertexData.colors = _this._convertToFloat4ColorArray(context, data, accessor);
+                                var hasVertexAlpha = GLTFLoader._GetNumComponents(context, accessor.type) === 4;
+                                if (!mesh.hasVertexAlpha && hasVertexAlpha) {
+                                    mesh.hasVertexAlpha = hasVertexAlpha;
+                                }
                                 break;
                             }
                             default: {

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

@@ -311,6 +311,7 @@ declare module BABYLON.GLTF2 {
         primitives: IGLTFMeshPrimitive[];
         weights?: number[];
         index: number;
+        hasVertexAlpha: boolean;
     }
     interface IGLTFNode extends IGLTFChildRootProperty {
         camera?: number;

+ 5 - 1
dist/preview release/loaders/babylon.glTF2FileLoader.js

@@ -745,7 +745,6 @@ var BABYLON;
                     return;
                 }
                 node.babylonMesh = new BABYLON.Mesh(node.name || "mesh" + node.index, this._babylonScene);
-                node.babylonMesh.hasVertexAlpha = true;
                 this._loadTransform(node);
                 if (node.mesh != null) {
                     var mesh = GLTFLoader._GetProperty(this._gltf.meshes, node.mesh);
@@ -800,6 +799,7 @@ var BABYLON;
                         var primitive = primitives_1[_i];
                         vertexData.merge(primitive.vertexData);
                     }
+                    node.babylonMesh.hasVertexAlpha = mesh.hasVertexAlpha;
                     new BABYLON.Geometry(node.babylonMesh.name, _this._babylonScene, vertexData, false, node.babylonMesh);
                     // TODO: optimize this so that sub meshes can be created without being overwritten after setting vertex data.
                     // Sub meshes must be cleared and created after setting vertex data because of mesh._createGlobalSubMesh.
@@ -1008,6 +1008,10 @@ var BABYLON;
                             }
                             case "COLOR_0": {
                                 vertexData.colors = _this._convertToFloat4ColorArray(context, data, accessor);
+                                var hasVertexAlpha = GLTFLoader._GetNumComponents(context, accessor.type) === 4;
+                                if (!mesh.hasVertexAlpha && hasVertexAlpha) {
+                                    mesh.hasVertexAlpha = hasVertexAlpha;
+                                }
                                 break;
                             }
                             default: {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 2
dist/preview release/loaders/babylon.glTF2FileLoader.min.js


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

@@ -868,6 +868,7 @@ declare module BABYLON.GLTF2 {
         primitives: IGLTFMeshPrimitive[];
         weights?: number[];
         index: number;
+        hasVertexAlpha: boolean;
     }
     interface IGLTFNode extends IGLTFChildRootProperty {
         camera?: number;

+ 5 - 1
dist/preview release/loaders/babylon.glTFFileLoader.js

@@ -2911,7 +2911,6 @@ var BABYLON;
                     return;
                 }
                 node.babylonMesh = new BABYLON.Mesh(node.name || "mesh" + node.index, this._babylonScene);
-                node.babylonMesh.hasVertexAlpha = true;
                 this._loadTransform(node);
                 if (node.mesh != null) {
                     var mesh = GLTFLoader._GetProperty(this._gltf.meshes, node.mesh);
@@ -2966,6 +2965,7 @@ var BABYLON;
                         var primitive = primitives_1[_i];
                         vertexData.merge(primitive.vertexData);
                     }
+                    node.babylonMesh.hasVertexAlpha = mesh.hasVertexAlpha;
                     new BABYLON.Geometry(node.babylonMesh.name, _this._babylonScene, vertexData, false, node.babylonMesh);
                     // TODO: optimize this so that sub meshes can be created without being overwritten after setting vertex data.
                     // Sub meshes must be cleared and created after setting vertex data because of mesh._createGlobalSubMesh.
@@ -3174,6 +3174,10 @@ var BABYLON;
                             }
                             case "COLOR_0": {
                                 vertexData.colors = _this._convertToFloat4ColorArray(context, data, accessor);
+                                var hasVertexAlpha = GLTFLoader._GetNumComponents(context, accessor.type) === 4;
+                                if (!mesh.hasVertexAlpha && hasVertexAlpha) {
+                                    mesh.hasVertexAlpha = hasVertexAlpha;
+                                }
                                 break;
                             }
                             default: {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 2
dist/preview release/loaders/babylon.glTFFileLoader.min.js


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

@@ -3867,7 +3867,6 @@ var BABYLON;
                     return;
                 }
                 node.babylonMesh = new BABYLON.Mesh(node.name || "mesh" + node.index, this._babylonScene);
-                node.babylonMesh.hasVertexAlpha = true;
                 this._loadTransform(node);
                 if (node.mesh != null) {
                     var mesh = GLTFLoader._GetProperty(this._gltf.meshes, node.mesh);
@@ -3922,6 +3921,7 @@ var BABYLON;
                         var primitive = primitives_1[_i];
                         vertexData.merge(primitive.vertexData);
                     }
+                    node.babylonMesh.hasVertexAlpha = mesh.hasVertexAlpha;
                     new BABYLON.Geometry(node.babylonMesh.name, _this._babylonScene, vertexData, false, node.babylonMesh);
                     // TODO: optimize this so that sub meshes can be created without being overwritten after setting vertex data.
                     // Sub meshes must be cleared and created after setting vertex data because of mesh._createGlobalSubMesh.
@@ -4130,6 +4130,10 @@ var BABYLON;
                             }
                             case "COLOR_0": {
                                 vertexData.colors = _this._convertToFloat4ColorArray(context, data, accessor);
+                                var hasVertexAlpha = GLTFLoader._GetNumComponents(context, accessor.type) === 4;
+                                if (!mesh.hasVertexAlpha && hasVertexAlpha) {
+                                    mesh.hasVertexAlpha = hasVertexAlpha;
+                                }
                                 break;
                             }
                             default: {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 2
dist/preview release/loaders/babylonjs.loaders.min.js


+ 1 - 0
dist/preview release/loaders/babylonjs.loaders.module.d.ts

@@ -966,6 +966,7 @@ declare module BABYLON.GLTF2 {
         primitives: IGLTFMeshPrimitive[];
         weights?: number[];
         index: number;
+        hasVertexAlpha: boolean;
     }
     interface IGLTFNode extends IGLTFChildRootProperty {
         camera?: number;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 38 - 38
dist/preview release/viewer/babylon.viewer.js


BIN=BIN
favicon.ico


+ 6 - 3
loaders/src/glTF/2.0/babylon.glTFLoader.ts

@@ -358,7 +358,6 @@ module BABYLON.GLTF2 {
             }
 
             node.babylonMesh = new Mesh(node.name || "mesh" + node.index, this._babylonScene);
-            node.babylonMesh.hasVertexAlpha = true;
 
             this._loadTransform(node);
 
@@ -426,7 +425,7 @@ module BABYLON.GLTF2 {
                 for (const primitive of primitives) {
                     vertexData.merge(primitive.vertexData);
                 }
-
+                node.babylonMesh.hasVertexAlpha = mesh.hasVertexAlpha;
                 new Geometry(node.babylonMesh.name, this._babylonScene, vertexData, false, node.babylonMesh);
 
                 // TODO: optimize this so that sub meshes can be created without being overwritten after setting vertex data.
@@ -647,6 +646,10 @@ module BABYLON.GLTF2 {
                         }
                         case "COLOR_0": {
                             vertexData.colors = this._convertToFloat4ColorArray(context, data, accessor);
+                            const hasVertexAlpha = GLTFLoader._GetNumComponents(context, accessor.type) === 4;
+                            if (!mesh.hasVertexAlpha && hasVertexAlpha) {
+                                mesh.hasVertexAlpha = hasVertexAlpha;
+                            }
                             break;
                         }
                         default: {
@@ -678,7 +681,7 @@ module BABYLON.GLTF2 {
                 });
             }
         }
-
+        
         private _createMorphTargets(context: string, node: IGLTFNode, mesh: IGLTFMesh): void {
             const primitives = mesh.primitives;
 

+ 1 - 0
loaders/src/glTF/2.0/babylon.glTFLoaderInterfaces.ts

@@ -217,6 +217,7 @@ module BABYLON.GLTF2 {
 
         // Runtime values
         index: number;
+        hasVertexAlpha: boolean;
     }
 
     export interface IGLTFNode extends IGLTFChildRootProperty {

+ 3 - 1
readme.md

@@ -3,7 +3,9 @@ Babylon.js
 
 Getting started? Play directly with the Babylon.js API via our [playground](http://www.babylonjs.com/playground). It contains also lot of simple samples to learn how to use it.
 
-[![Build Status](https://travis-ci.org/BabylonJS/Babylon.js.svg)](https://travis-ci.org/BabylonJS/Babylon.js)
+[![Build Status](https://travis-ci.org/BabylonJS/Babylon.js.svg)](https://travis-ci.org/BabylonJS/Babylon.js) 
+
+[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=d0pZcGpNU0NPeTM5cEpEc2lTU2JJTWc2Mk9NSlAzTzdIaFBpTnF2TjBycz0tLStUWkVBejdVQmN4Y0dIUVVYeU0yc2c9PQ==--4e576f7b7c21279bc6d026b6f51796f58134856b)](https://www.browserstack.com/automate/public-build/d0pZcGpNU0NPeTM5cEpEc2lTU2JJTWc2Mk9NSlAzTzdIaFBpTnF2TjBycz0tLStUWkVBejdVQmN4Y0dIUVVYeU0yc2c9PQ==--4e576f7b7c21279bc6d026b6f51796f58134856b)
 
 **Any questions?** Here is our official [forum](http://www.html5gamedevs.com/forum/16-babylonjs/) on www.html5gamedevs.com.
 

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

@@ -397,11 +397,6 @@
             // Animations
             this.getScene().stopAnimation(this);
 
-            // Remove from meshes
-            for (var mesh of this.getScene().meshes) {
-                mesh._removeLightSource(this);
-            }
-
             this._uniformBuffer.dispose();
 
             // Remove from scene

+ 5 - 1
src/Mesh/babylon.meshBuilder.ts

@@ -775,6 +775,10 @@
                     throw new Error("Unable to get 2d context for CreateGroundFromHeightMap");
                 }
 
+                if (scene.isDisposed) {
+                    return;
+                }
+
                 var bufferWidth = img.width;
                 var bufferHeight = img.height;
                 canvas.width = bufferWidth;
@@ -1264,7 +1268,7 @@
 
                 var angle = 0;
                 var returnScale: { (i: number, distance: number): number; } = () => { return scale !== null ? scale : 1; };
-                var returnRotation: { (i: number, distance: number): number; } = () => { return rotation!== null ? rotation : 0; };
+                var returnRotation: { (i: number, distance: number): number; } = () => { return rotation !== null ? rotation : 0; };
                 var rotate: { (i: number, distance: number): number; } = custom && rotateFunction ? rotateFunction : returnRotation;
                 var scl: { (i: number, distance: number): number; } = custom && scaleFunction ? scaleFunction : returnScale;
                 var index = (cap === Mesh.NO_CAP || cap === Mesh.CAP_END) ? 0 : 2;

+ 13 - 0
src/babylon.scene.ts

@@ -2278,6 +2278,11 @@
         public removeLight(toRemove: Light): number {
             var index = this.lights.indexOf(toRemove);
             if (index !== -1) {
+                // Remove from meshes
+                for (var mesh of this.meshes) {
+                    mesh._removeLightSource(toRemove);
+                }
+
                 // Remove from the scene if mesh found
                 this.lights.splice(index, 1);
                 this.sortLightsByPriority();
@@ -2314,6 +2319,14 @@
             this.lights.push(newLight);
             this.sortLightsByPriority();
 
+            // Add light to all meshes (To support if the light is removed and then readded)
+            for (var mesh of this.meshes) {
+                if(mesh._lightSources.indexOf(newLight) === -1){
+                    mesh._lightSources.push(newLight);
+                    mesh._resyncLightSources();
+                }
+            }
+
             this.onNewLightAddedObservable.notifyObservers(newLight);
         }
 

+ 9 - 2
tests/validation/integration.js

@@ -18,6 +18,10 @@ xhr.addEventListener("load", function () {
                     .require('/tests/validation/validation.js')
                     .useDist()
                     .load(function () {
+                        var info = engine.getGlInfo();
+                        console.log("Webgl Version: " + info.version);
+                        console.log("Webgl Vendor: " + info.vendor);
+                        console.log("Webgl Renderer: " + info.renderer);
                         done();
                     });
             });
@@ -33,12 +37,15 @@ xhr.addEventListener("load", function () {
                     this.timeout(240000);
 
                     try {
-                        runTest(index, function (result) {
+                        runTest(index, function(result, screenshot) {
                             try {
-                                expect(result).to.be.true;
+                                expect(result).to.be.true; 
                                 done();
                             }
                             catch (e) {
+                                if (screenshot) {
+                                    console.error(screenshot);
+                                }
                                 done(e);
                             }
                         });

+ 89 - 0
tests/validation/karma.conf.browserstack.js

@@ -0,0 +1,89 @@
+module.exports = function (config) {
+    'use strict';
+    config.set({
+
+        basePath: '../../',
+        captureTimeout: 3e5,
+        browserNoActivityTimeout: 3e5,
+        browserDisconnectTimeout: 3e5,
+        browserDisconnectTolerance: 3,
+
+        urlRoot: '/karma',
+
+        frameworks: ['mocha', 'chai', 'sinon'],
+
+        files: [
+            './Tools/DevLoader/BabylonLoader.js',
+            './tests/validation/index.css',
+            './tests/validation/integration.js',
+            './favicon.ico',
+            { pattern: 'dist/**/*', watched: false, included: false, served: true },
+            { pattern: 'assets/**/*', watched: false, included: false, served: true },
+            { pattern: 'tests/**/*', watched: false, included: false, served: true },
+            { pattern: 'Playground/scenes/**/*', watched: false, included: false, served: true },
+            { pattern: 'Playground/textures/**/*', watched: false, included: false, served: true },
+            { pattern: 'Playground/sounds/**/*', watched: false, included: false, served: true },
+            { pattern: 'Tools/DevLoader/**/*', watched: false, included: false, served: true },            
+            { pattern: 'Tools/Gulp/config.json', watched: false, included: false, served: true },
+        ],
+        proxies: {
+            '/': '/base/'
+        },
+
+        port: 1338,
+        colors: true,
+        autoWatch: false,
+        singleRun: false,
+
+        // level of logging
+        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+        logLevel: config.LOG_INFO,
+
+        browserStack: {
+            project: 'Babylon JS Validation Tests',
+            video: false,
+            debug : 'true',
+            timeout: 900
+        },
+        customLaunchers: {
+            bs_chrome_win: {
+                base: 'BrowserStack',
+                browser: 'Chrome',
+                browser_version: '63.0',
+                os: 'Windows',
+                os_version: '10'
+            },
+            bs_edge_win: {
+                base: 'BrowserStack',
+                browser: 'Edge',
+                browser_version: '16.0',
+                os: 'Windows',
+                os_version: '10'
+            },
+            bs_firefox_win: {
+                base: 'BrowserStack',
+                browser: 'Firefox',
+                browser_version: '57.0',
+                os: 'Windows',
+                os_version: '10'
+            },
+            bs_chrome_android: {
+                base: 'BrowserStack',
+                os: 'Android',
+                os_version : '8.0',
+                device : 'Google Pixel',
+                real_mobile : 'true'
+            },
+            bs_safari_ios: {
+                base: 'BrowserStack',
+                os: 'ios',
+                os_version : '10.3',
+                device : 'iPhone 7',
+                real_mobile : 'true'
+            }
+        },
+        browsers: ['bs_firefox_win', 'bs_chrome_android'],
+        reporters: ['dots', 'BrowserStack'],
+        singleRun: true
+    });
+};

+ 0 - 74
tests/validation/karma.conf.saucelabs.js

@@ -1,74 +0,0 @@
-// sl_ie_11: {
-//     base: 'SauceLabs',
-//     browserName: 'internet explorer',
-//     platform: 'Windows 10',
-//     version: '11'
-// },
-// sl_android: {
-//     base: 'SauceLabs',
-//     browserName: 'Browser',
-//     platform: 'Android',
-//     version: '4.4',
-//     deviceName: 'Samsung Galaxy S3 Emulator',
-//     deviceOrientation: 'portrait'
-// }
-
-module.exports = function (config) {
-    'use strict';
-    config.set({
-
-        basePath: '../../',
-        browserNoActivityTimeout: 1800000,
-
-        urlRoot: '/karma',
-
-        frameworks: ['mocha', 'chai', 'sinon'],
-
-        files: [
-            './Tools/DevLoader/BabylonLoader.js',
-            './tests/validation/index.css',
-            './tests/validation/integration.js',
-            { pattern: 'dist/**/*', watched: false, included: false, served: true },
-            { pattern: 'assets/**/*', watched: false, included: false, served: true },
-            { pattern: 'tests/**/*', watched: false, included: false, served: true },
-            { pattern: 'Playground/scenes/**/*', watched: false, included: false, served: true },
-            { pattern: 'Playground/textures/**/*', watched: false, included: false, served: true },
-            { pattern: 'Playground/sounds/**/*', watched: false, included: false, served: true },
-            { pattern: 'Tools/DevLoader/**/*', watched: false, included: false, served: true },            
-            { pattern: 'Tools/Gulp/config.json', watched: false, included: false, served: true },
-        ],
-        proxies: {
-            '/': '/base/'
-        },
-
-        port: 1338,
-        colors: true,
-        autoWatch: false,
-        singleRun: false,
-
-        // level of logging
-        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-        logLevel: config.LOG_ERROR,
-
-        sauceLabs: {
-            testName: 'Babylon JS Validation Tests',
-            startConnect: false,
-            tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
-            build: process.env.TRAVIS_BUILD_NUMBER,
-            tags: [process.env.TRAVIS_BRANCH, process.env.TRAVIS_PULL_REQUEST],
-            public: 'public'
-        },
-        customLaunchers: {
-            sl_firefox: {
-              base: 'SauceLabs',
-              browserName: 'firefox',
-              platform: 'Windows 10',
-              version: '57',
-              tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER
-            }
-        },
-        browsers: ['sl_firefox'],
-        reporters: ['dots', 'saucelabs'],
-        singleRun: true
-    });
-};

+ 3 - 2
tests/validation/validation.js

@@ -120,11 +120,12 @@ function evaluate(test, resultCanvas, result, renderImage, index, waitRing, done
     }
     waitRing.classList.add("hidden");
 
-    renderImage.src = saveRenderImage(renderData, canvas);
+    var renderB64 = saveRenderImage(renderData, canvas);
+    renderImage.src = renderB64;
 
     currentScene.dispose();
 
-    done(testRes);
+    done(testRes, renderB64);
 }
 
 function processCurrentScene(test, resultCanvas, result, renderImage, index, waitRing, done) {