浏览代码

Fix issue with GPU particles

David Catuhe 7 年之前
父节点
当前提交
e34501a8b1
共有 27 个文件被更改,包括 26957 次插入26361 次删除
  1. 11363 11252
      Playground/babylon.d.txt
  2. 8130 8110
      dist/preview release/babylon.d.ts
  3. 7 7
      dist/preview release/babylon.js
  4. 79 8
      dist/preview release/babylon.max.js
  5. 7 7
      dist/preview release/babylon.worker.js
  6. 6959 6847
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts
  7. 22 22
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js
  8. 19 12
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js
  9. 19 12
      dist/preview release/customConfigurations/minimalGLTFViewer/es6.js
  10. 79 8
      dist/preview release/es6.js
  11. 1 0
      dist/preview release/loaders/babylon.glTF2FileLoader.d.ts
  12. 14 2
      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. 14 2
      dist/preview release/loaders/babylon.glTFFileLoader.js
  16. 2 2
      dist/preview release/loaders/babylon.glTFFileLoader.min.js
  17. 14 2
      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. 23 22
      dist/preview release/viewer/babylon.viewer.js
  21. 88 15
      dist/preview release/viewer/babylon.viewer.max.js
  22. 4 0
      src/Engine/babylon.nullEngine.ts
  23. 0 6
      src/Math/babylon.math.ts
  24. 1 1
      src/Mesh/Compression/babylon.dracoCompression.ts
  25. 74 1
      src/Particles/babylon.gpuParticleSystem.ts
  26. 7 7
      src/Shaders/gpuUpdateParticles.vertex.fx
  27. 25 12
      tests/nullEngine/app.js

文件差异内容过多而无法显示
+ 11363 - 11252
Playground/babylon.d.txt


文件差异内容过多而无法显示
+ 8130 - 8110
dist/preview release/babylon.d.ts


文件差异内容过多而无法显示
+ 7 - 7
dist/preview release/babylon.js


文件差异内容过多而无法显示
+ 79 - 8
dist/preview release/babylon.max.js


文件差异内容过多而无法显示
+ 7 - 7
dist/preview release/babylon.worker.js


文件差异内容过多而无法显示
+ 6959 - 6847
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


文件差异内容过多而无法显示
+ 22 - 22
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 19 - 12
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -1679,7 +1679,6 @@ var BABYLON;
          */
         Color3.FromHexString = function (hex) {
             if (hex.substring(0, 1) !== "#" || hex.length !== 7) {
-                //Tools.Warn("Color3.FromHexString must be called with a string like #FFFFFF");
                 return new Color3(0, 0, 0);
             }
             var r = parseInt(hex.substring(1, 3), 16);
@@ -2071,7 +2070,6 @@ var BABYLON;
          */
         Color4.FromHexString = function (hex) {
             if (hex.substring(0, 1) !== "#" || hex.length !== 9) {
-                //Tools.Warn("Color4.FromHexString must be called with a string like #FFFFFFFF");
                 return new Color4(0.0, 0.0, 0.0, 0.0);
             }
             var r = parseInt(hex.substring(1, 3), 16);
@@ -6198,7 +6196,6 @@ var BABYLON;
          */
         Path2.prototype.addLineTo = function (x, y) {
             if (this.closed) {
-                //Tools.Error("cannot add lines to closed paths");
                 return this;
             }
             var newPoint = new Vector2(x, y);
@@ -6214,7 +6211,6 @@ var BABYLON;
         Path2.prototype.addArcTo = function (midX, midY, endX, endY, numberOfSegments) {
             if (numberOfSegments === void 0) { numberOfSegments = 36; }
             if (this.closed) {
-                //Tools.Error("cannot add arcs to closed paths");
                 return this;
             }
             var startPoint = this._points[this._points.length - 1];
@@ -6264,7 +6260,6 @@ var BABYLON;
          */
         Path2.prototype.getPointAtLengthPosition = function (normalizedLengthPosition) {
             if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) {
-                //Tools.Error("normalized length position should be between 0 and 1.");
                 return Vector2.Zero();
             }
             var lengthPosition = normalizedLengthPosition * this.length();
@@ -6282,7 +6277,6 @@ var BABYLON;
                 }
                 previousOffset = nextOffset;
             }
-            //Tools.Error("internal error");
             return Vector2.Zero();
         };
         /**
@@ -51689,9 +51683,10 @@ var BABYLON;
         SphereParticleEmitter.prototype.startPositionFunction = function (worldMatrix, positionToUpdate, particle) {
             var phi = BABYLON.Scalar.RandomRange(0, 2 * Math.PI);
             var theta = BABYLON.Scalar.RandomRange(0, Math.PI);
-            var randX = this.radius * Math.cos(phi) * Math.sin(theta);
-            var randY = this.radius * Math.cos(theta);
-            var randZ = this.radius * Math.sin(phi) * Math.sin(theta);
+            var randRadius = BABYLON.Scalar.RandomRange(0, this.radius);
+            var randX = randRadius * Math.cos(phi) * Math.sin(theta);
+            var randY = randRadius * Math.cos(theta);
+            var randZ = randRadius * Math.sin(phi) * Math.sin(theta);
             BABYLON.Vector3.TransformCoordinatesFromFloatsToRef(randX, randY, randZ, worldMatrix, positionToUpdate);
         };
         /**
@@ -55722,7 +55717,7 @@ var BABYLON;
              * Returns whether Draco compression is supported.
              */
             get: function () {
-                return !!window.DracoDecoderModule;
+                return BABYLON.Tools.IsWindowObjectExist() && !!window.DracoDecoderModule;
             },
             enumerable: true,
             configurable: true
@@ -92132,6 +92127,7 @@ var BABYLON;
                     _this._progressCallback = onProgress;
                     _this._state = BABYLON.GLTFLoaderState.Loading;
                     _this._loadData(data);
+                    _this._checkExtensions();
                     var promises = new Array();
                     if (nodes) {
                         promises.push(_this._loadNodesAsync(nodes));
@@ -92228,6 +92224,17 @@ var BABYLON;
                     }
                 }
             };
+            GLTFLoader.prototype._checkExtensions = function () {
+                if (this._gltf.extensionsRequired) {
+                    for (var _i = 0, _a = this._gltf.extensionsRequired; _i < _a.length; _i++) {
+                        var name_2 = _a[_i];
+                        var extension = this._extensions[name_2];
+                        if (!extension || !extension.enabled) {
+                            throw new Error("Require extension " + name_2 + " is not available");
+                        }
+                    }
+                }
+            };
             GLTFLoader.prototype._createRootNode = function () {
                 this._rootBabylonMesh = new BABYLON.Mesh("__root__", this._babylonScene);
                 var rootNode = { _babylonMesh: this._rootBabylonMesh };
@@ -93370,8 +93377,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_2 = _a[_i];
-                    var extension = this._extensions[name_2];
+                    var name_3 = _a[_i];
+                    var extension = this._extensions[name_3];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {

+ 19 - 12
dist/preview release/customConfigurations/minimalGLTFViewer/es6.js

@@ -1665,7 +1665,6 @@ var BABYLON;
          */
         Color3.FromHexString = function (hex) {
             if (hex.substring(0, 1) !== "#" || hex.length !== 7) {
-                //Tools.Warn("Color3.FromHexString must be called with a string like #FFFFFF");
                 return new Color3(0, 0, 0);
             }
             var r = parseInt(hex.substring(1, 3), 16);
@@ -2057,7 +2056,6 @@ var BABYLON;
          */
         Color4.FromHexString = function (hex) {
             if (hex.substring(0, 1) !== "#" || hex.length !== 9) {
-                //Tools.Warn("Color4.FromHexString must be called with a string like #FFFFFFFF");
                 return new Color4(0.0, 0.0, 0.0, 0.0);
             }
             var r = parseInt(hex.substring(1, 3), 16);
@@ -6184,7 +6182,6 @@ var BABYLON;
          */
         Path2.prototype.addLineTo = function (x, y) {
             if (this.closed) {
-                //Tools.Error("cannot add lines to closed paths");
                 return this;
             }
             var newPoint = new Vector2(x, y);
@@ -6200,7 +6197,6 @@ var BABYLON;
         Path2.prototype.addArcTo = function (midX, midY, endX, endY, numberOfSegments) {
             if (numberOfSegments === void 0) { numberOfSegments = 36; }
             if (this.closed) {
-                //Tools.Error("cannot add arcs to closed paths");
                 return this;
             }
             var startPoint = this._points[this._points.length - 1];
@@ -6250,7 +6246,6 @@ var BABYLON;
          */
         Path2.prototype.getPointAtLengthPosition = function (normalizedLengthPosition) {
             if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) {
-                //Tools.Error("normalized length position should be between 0 and 1.");
                 return Vector2.Zero();
             }
             var lengthPosition = normalizedLengthPosition * this.length();
@@ -6268,7 +6263,6 @@ var BABYLON;
                 }
                 previousOffset = nextOffset;
             }
-            //Tools.Error("internal error");
             return Vector2.Zero();
         };
         /**
@@ -51675,9 +51669,10 @@ var BABYLON;
         SphereParticleEmitter.prototype.startPositionFunction = function (worldMatrix, positionToUpdate, particle) {
             var phi = BABYLON.Scalar.RandomRange(0, 2 * Math.PI);
             var theta = BABYLON.Scalar.RandomRange(0, Math.PI);
-            var randX = this.radius * Math.cos(phi) * Math.sin(theta);
-            var randY = this.radius * Math.cos(theta);
-            var randZ = this.radius * Math.sin(phi) * Math.sin(theta);
+            var randRadius = BABYLON.Scalar.RandomRange(0, this.radius);
+            var randX = randRadius * Math.cos(phi) * Math.sin(theta);
+            var randY = randRadius * Math.cos(theta);
+            var randZ = randRadius * Math.sin(phi) * Math.sin(theta);
             BABYLON.Vector3.TransformCoordinatesFromFloatsToRef(randX, randY, randZ, worldMatrix, positionToUpdate);
         };
         /**
@@ -55708,7 +55703,7 @@ var BABYLON;
              * Returns whether Draco compression is supported.
              */
             get: function () {
-                return !!window.DracoDecoderModule;
+                return BABYLON.Tools.IsWindowObjectExist() && !!window.DracoDecoderModule;
             },
             enumerable: true,
             configurable: true
@@ -92118,6 +92113,7 @@ var BABYLON;
                     _this._progressCallback = onProgress;
                     _this._state = BABYLON.GLTFLoaderState.Loading;
                     _this._loadData(data);
+                    _this._checkExtensions();
                     var promises = new Array();
                     if (nodes) {
                         promises.push(_this._loadNodesAsync(nodes));
@@ -92214,6 +92210,17 @@ var BABYLON;
                     }
                 }
             };
+            GLTFLoader.prototype._checkExtensions = function () {
+                if (this._gltf.extensionsRequired) {
+                    for (var _i = 0, _a = this._gltf.extensionsRequired; _i < _a.length; _i++) {
+                        var name_2 = _a[_i];
+                        var extension = this._extensions[name_2];
+                        if (!extension || !extension.enabled) {
+                            throw new Error("Require extension " + name_2 + " is not available");
+                        }
+                    }
+                }
+            };
             GLTFLoader.prototype._createRootNode = function () {
                 this._rootBabylonMesh = new BABYLON.Mesh("__root__", this._babylonScene);
                 var rootNode = { _babylonMesh: this._rootBabylonMesh };
@@ -93356,8 +93363,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_2 = _a[_i];
-                    var extension = this._extensions[name_2];
+                    var name_3 = _a[_i];
+                    var extension = this._extensions[name_3];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {

文件差异内容过多而无法显示
+ 79 - 8
dist/preview release/es6.js


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

@@ -304,6 +304,7 @@ declare module BABYLON.GLTF2 {
         private _loadExtensions();
         private _loadData(data);
         private _setupData();
+        private _checkExtensions();
         private _createRootNode();
         private _loadNodesAsync(nodes);
         _loadSceneAsync(context: string, scene: ILoaderScene): Promise<void>;

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

@@ -571,6 +571,7 @@ var BABYLON;
                     _this._progressCallback = onProgress;
                     _this._state = BABYLON.GLTFLoaderState.Loading;
                     _this._loadData(data);
+                    _this._checkExtensions();
                     var promises = new Array();
                     if (nodes) {
                         promises.push(_this._loadNodesAsync(nodes));
@@ -667,6 +668,17 @@ var BABYLON;
                     }
                 }
             };
+            GLTFLoader.prototype._checkExtensions = function () {
+                if (this._gltf.extensionsRequired) {
+                    for (var _i = 0, _a = this._gltf.extensionsRequired; _i < _a.length; _i++) {
+                        var name_2 = _a[_i];
+                        var extension = this._extensions[name_2];
+                        if (!extension || !extension.enabled) {
+                            throw new Error("Require extension " + name_2 + " is not available");
+                        }
+                    }
+                }
+            };
             GLTFLoader.prototype._createRootNode = function () {
                 this._rootBabylonMesh = new BABYLON.Mesh("__root__", this._babylonScene);
                 var rootNode = { _babylonMesh: this._rootBabylonMesh };
@@ -1809,8 +1821,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_2 = _a[_i];
-                    var extension = this._extensions[name_2];
+                    var name_3 = _a[_i];
+                    var extension = this._extensions[name_3];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {

文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/loaders/babylon.glTF2FileLoader.min.js


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

@@ -859,6 +859,7 @@ declare module BABYLON.GLTF2 {
         private _loadExtensions();
         private _loadData(data);
         private _setupData();
+        private _checkExtensions();
         private _createRootNode();
         private _loadNodesAsync(nodes);
         _loadSceneAsync(context: string, scene: ILoaderScene): Promise<void>;

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

@@ -2747,6 +2747,7 @@ var BABYLON;
                     _this._progressCallback = onProgress;
                     _this._state = BABYLON.GLTFLoaderState.Loading;
                     _this._loadData(data);
+                    _this._checkExtensions();
                     var promises = new Array();
                     if (nodes) {
                         promises.push(_this._loadNodesAsync(nodes));
@@ -2843,6 +2844,17 @@ var BABYLON;
                     }
                 }
             };
+            GLTFLoader.prototype._checkExtensions = function () {
+                if (this._gltf.extensionsRequired) {
+                    for (var _i = 0, _a = this._gltf.extensionsRequired; _i < _a.length; _i++) {
+                        var name_2 = _a[_i];
+                        var extension = this._extensions[name_2];
+                        if (!extension || !extension.enabled) {
+                            throw new Error("Require extension " + name_2 + " is not available");
+                        }
+                    }
+                }
+            };
             GLTFLoader.prototype._createRootNode = function () {
                 this._rootBabylonMesh = new BABYLON.Mesh("__root__", this._babylonScene);
                 var rootNode = { _babylonMesh: this._rootBabylonMesh };
@@ -3985,8 +3997,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_2 = _a[_i];
-                    var extension = this._extensions[name_2];
+                    var name_3 = _a[_i];
+                    var extension = this._extensions[name_3];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {

文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/loaders/babylon.glTFFileLoader.min.js


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

@@ -3715,6 +3715,7 @@ var BABYLON;
                     _this._progressCallback = onProgress;
                     _this._state = BABYLON.GLTFLoaderState.Loading;
                     _this._loadData(data);
+                    _this._checkExtensions();
                     var promises = new Array();
                     if (nodes) {
                         promises.push(_this._loadNodesAsync(nodes));
@@ -3811,6 +3812,17 @@ var BABYLON;
                     }
                 }
             };
+            GLTFLoader.prototype._checkExtensions = function () {
+                if (this._gltf.extensionsRequired) {
+                    for (var _i = 0, _a = this._gltf.extensionsRequired; _i < _a.length; _i++) {
+                        var name_2 = _a[_i];
+                        var extension = this._extensions[name_2];
+                        if (!extension || !extension.enabled) {
+                            throw new Error("Require extension " + name_2 + " is not available");
+                        }
+                    }
+                }
+            };
             GLTFLoader.prototype._createRootNode = function () {
                 this._rootBabylonMesh = new BABYLON.Mesh("__root__", this._babylonScene);
                 var rootNode = { _babylonMesh: this._rootBabylonMesh };
@@ -4953,8 +4965,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_2 = _a[_i];
-                    var extension = this._extensions[name_2];
+                    var name_3 = _a[_i];
+                    var extension = this._extensions[name_3];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {

文件差异内容过多而无法显示
+ 2 - 2
dist/preview release/loaders/babylonjs.loaders.min.js


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

@@ -960,6 +960,7 @@ declare module BABYLON.GLTF2 {
         private _loadExtensions();
         private _loadData(data);
         private _setupData();
+        private _checkExtensions();
         private _createRootNode();
         private _loadNodesAsync(nodes);
         _loadSceneAsync(context: string, scene: ILoaderScene): Promise<void>;

文件差异内容过多而无法显示
+ 23 - 22
dist/preview release/viewer/babylon.viewer.js


文件差异内容过多而无法显示
+ 88 - 15
dist/preview release/viewer/babylon.viewer.max.js


+ 4 - 0
src/Engine/babylon.nullEngine.ts

@@ -25,6 +25,10 @@
             return this._options.lockstepMaxSteps;
         }
 
+        public getHardwareScalingLevel(): number {
+            return 1.0;
+        }
+
         public constructor(options: NullEngineOptions = new NullEngineOptions()) {
             super(null);
 

+ 0 - 6
src/Math/babylon.math.ts

@@ -334,7 +334,6 @@
          */
         public static FromHexString(hex: string): Color3 {
             if (hex.substring(0, 1) !== "#" || hex.length !== 7) {
-                //Tools.Warn("Color3.FromHexString must be called with a string like #FFFFFF");
                 return new Color3(0, 0, 0);
             }
 
@@ -746,7 +745,6 @@
          */
         public static FromHexString(hex: string): Color4 {
             if (hex.substring(0, 1) !== "#" || hex.length !== 9) {
-                //Tools.Warn("Color4.FromHexString must be called with a string like #FFFFFFFF");
                 return new Color4(0.0, 0.0, 0.0, 0.0);
             }
 
@@ -5290,7 +5288,6 @@
          */
         public addLineTo(x: number, y: number): Path2 {
             if (this.closed) {
-                //Tools.Error("cannot add lines to closed paths");
                 return this;
             }
             var newPoint = new Vector2(x, y);
@@ -5306,7 +5303,6 @@
          */
         public addArcTo(midX: number, midY: number, endX: number, endY: number, numberOfSegments = 36): Path2 {
             if (this.closed) {
-                //Tools.Error("cannot add arcs to closed paths");
                 return this;
             }
             var startPoint = this._points[this._points.length - 1];
@@ -5361,7 +5357,6 @@
          */
         public getPointAtLengthPosition(normalizedLengthPosition: number): Vector2 {
             if (normalizedLengthPosition < 0 || normalizedLengthPosition > 1) {
-                //Tools.Error("normalized length position should be between 0 and 1.");
                 return Vector2.Zero();
             }
 
@@ -5388,7 +5383,6 @@
                 previousOffset = nextOffset;
             }
 
-            //Tools.Error("internal error");
             return Vector2.Zero();
         }
 

+ 1 - 1
src/Mesh/Compression/babylon.dracoCompression.ts

@@ -11,7 +11,7 @@ module BABYLON {
          * Returns whether Draco compression is supported.
          */
         public static get IsSupported(): boolean {
-            return !!window.DracoDecoderModule;
+            return Tools.IsWindowObjectExist() && !!window.DracoDecoderModule;
         }
 
         /**

+ 74 - 1
src/Particles/babylon.gpuParticleSystem.ts

@@ -158,7 +158,79 @@
          * The particle emitter type defines the emitter used by the particle system.
          * It can be for example box, sphere, or cone...
          */
-        public particleEmitterType: Nullable<IParticleEmitterType>;        
+        public particleEmitterType: Nullable<IParticleEmitterType>;    
+
+        /**
+         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
+         * This only works when particleEmitterTyps is a BoxParticleEmitter
+         */
+        public get direction1(): Vector3 {
+            if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {
+                return (<BoxParticleEmitter>this.particleEmitterType).direction1;
+            }
+
+            return Vector3.Zero();
+        }
+
+        public set direction1(value: Vector3) {
+            if ((<BoxParticleEmitter>this.particleEmitterType).direction1) {
+                (<BoxParticleEmitter>this.particleEmitterType).direction1 = value;
+            }
+        }        
+        
+        /**
+         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
+         * This only works when particleEmitterTyps is a BoxParticleEmitter
+         */
+        public get direction2(): Vector3 {
+            if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {
+                return (<BoxParticleEmitter>this.particleEmitterType).direction2;
+            }
+
+            return Vector3.Zero();
+        }
+
+        public set direction2(value: Vector3) {
+            if ((<BoxParticleEmitter>this.particleEmitterType).direction2) {
+                (<BoxParticleEmitter>this.particleEmitterType).direction2 = value;
+            }
+        }
+
+        /**
+         * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
+         * This only works when particleEmitterTyps is a BoxParticleEmitter
+         */
+        public get minEmitBox(): Vector3 {
+            if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {
+                return (<BoxParticleEmitter>this.particleEmitterType).minEmitBox;
+            }
+
+            return Vector3.Zero();
+        }
+
+        public set minEmitBox(value: Vector3) {
+            if ((<BoxParticleEmitter>this.particleEmitterType).minEmitBox) {
+                (<BoxParticleEmitter>this.particleEmitterType).minEmitBox = value;
+            }
+        }      
+        
+        /**
+         * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
+         * This only works when particleEmitterTyps is a BoxParticleEmitter
+         */
+        public get maxEmitBox(): Vector3 {
+            if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {
+                return (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox;
+            }
+
+            return Vector3.Zero();
+        }
+
+        public set maxEmitBox(value: Vector3) {
+            if ((<BoxParticleEmitter>this.particleEmitterType).maxEmitBox) {
+                (<BoxParticleEmitter>this.particleEmitterType).maxEmitBox = value;
+            }
+        }        
 
         /**
          * Gets the maximum number of particles active at the same time.
@@ -281,6 +353,7 @@
             this._randomTexture.wrapV = Texture.WRAP_ADDRESSMODE;
 
             this._randomTextureSize = maxTextureSize;
+            this.particleEmitterType = new BoxParticleEmitter();
         }
 
         private _createUpdateVAO(source: Buffer): WebGLVertexArrayObject {            

+ 7 - 7
src/Shaders/gpuUpdateParticles.vertex.fx

@@ -108,10 +108,10 @@ void main() {
     position = (radius * randoms2.z) * vec3(randX, randY, randZ);
 
     #ifdef DIRECTEDSPHEREEMITTER
-        direction = direction1 + (direction2 - direction1) * randoms3;
+      direction = direction1 + (direction2 - direction1) * randoms3;
     #else
-        // Direction
-        direction = position + directionRandomizer * randoms3;
+      // Direction
+      direction = position + directionRandomizer * randoms3;
     #endif
 #elif defined(CONEEMITTER)
     vec3 randoms2 = getRandomVec3(generalRandoms.y);
@@ -132,10 +132,10 @@ void main() {
 
     // Direction
     if (angle == 0.) {
-      direction = vec3(0., 1.0, 0.);
+        direction = vec3(0., 1.0, 0.);
     } else {
-      vec3 randoms3 = getRandomVec3(generalRandoms.z);
-      direction = position + directionRandomizer * randoms3;
+        vec3 randoms3 = getRandomVec3(generalRandoms.z);
+        direction = position + directionRandomizer * randoms3;
     }
 #else    
     // Create the particle at origin
@@ -148,7 +148,7 @@ void main() {
     float power = emitPower.x + (emitPower.y - emitPower.x) * randoms.a;
 
     outPosition = (emitterWM * vec4(position, 1.)).xyz;
-    outDirection = (emitterWM * vec4(normalize(direction) * power, 0.)).xyz;
+    outDirection = (emitterWM * vec4(direction * power, 0.)).xyz;
 
   } else {   
     outPosition = position + (direction + gravity) * timeDelta;

+ 25 - 12
tests/nullEngine/app.js

@@ -129,16 +129,29 @@ var engine = new BABYLON.NullEngine();
 //     scene.render();
 // })
 
-new BABYLON.Scene(engine).dispose()
-
-BABYLON.SceneLoader.Load("https://playground.babylonjs.com/scenes/", "skull.babylon", engine, (scene) => {
-    console.log('scene loaded!');
-    for (var index = 0; index < scene.meshes.length; index++) {
-        console.log(scene.meshes[index].name);
-    } 
-    engine.dispose();   
-   // engine.runRenderLoop(function() {
-     //   scene.render();
-    //});
+// new BABYLON.Scene(engine).dispose()
+
+// BABYLON.SceneLoader.Load("https://playground.babylonjs.com/scenes/", "skull.babylon", engine, (scene) => {
+//     console.log('scene loaded!');
+//     for (var index = 0; index < scene.meshes.length; index++) {
+//         console.log(scene.meshes[index].name);
+//     } 
+//     engine.dispose();   
+//    // engine.runRenderLoop(function() {
+//      //   scene.render();
+//     //});
   
-  }, progress => {}, (scene, err) => console.error('error:', err));
+//   }, progress => {}, (scene, err) => console.error('error:', err));
+var scene = new BABYLON.Scene(engine);
+var camera = new BABYLON.ArcRotateCamera("camera", 0, 0, 0, BABYLON.Vector3.Zero(), scene);
+scene.render();
+var pos = BABYLON.Vector3.Project(
+              new BABYLON.Vector3(0.5, 0.5, 0.5),
+              BABYLON.Matrix.Identity(),
+              scene.getTransformMatrix(),
+              scene.activeCamera.viewport.toGlobal(
+              engine.getRenderWidth(),
+              engine.getRenderHeight()
+            ));;
+
+            console.log(pos);