Преглед на файлове

Worker can be in a single file

If single files are loaded, the worked will load the needed scripts.
Worker's location has to be configured in line 214 of
babylon.collisionCoordinator.ts , as the path of the current script's
location is not a standard JS parameter.
The worker's js needs to be included in the main html file as well.
Legacy collision is not the default.
Gulp config was changed to fit the new needs.
Raanan Weber преди 10 години
родител
ревизия
df0a1bfc93

+ 4 - 3
Babylon/Collisions/babylon.collisionCoordinator.js

@@ -129,8 +129,8 @@ var BABYLON;
         CollisionCoordinatorWorker.prototype.init = function (scene) {
             this._scene = scene;
             this._scene.registerAfterRender(this._afterRender);
-            var blobURL = URL.createObjectURL(new Blob([BABYLON.CollisionWorker], { type: 'application/javascript' }));
-            this._worker = new Worker(blobURL);
+            var workerUrl = BABYLON.WorkerIncluded ? "./Collisions/babylon.collisionWorker.js" : URL.createObjectURL(new Blob([BABYLON.CollisionWorker], { type: 'application/javascript' }));
+            this._worker = new Worker(workerUrl);
             this._worker.onmessage = this._onMessageFromWorker;
             var message = {
                 payload: {},
@@ -269,4 +269,5 @@ var BABYLON;
     })();
     BABYLON.CollisionCoordinatorLegacy = CollisionCoordinatorLegacy;
 })(BABYLON || (BABYLON = {}));
-//# sourceMappingURL=babylon.collisionCoordinator.js.map
+
+//# sourceMappingURL=../Collisions/babylon.collisionCoordinator.js.map

+ 2 - 2
Babylon/Collisions/babylon.collisionCoordinator.ts

@@ -211,8 +211,8 @@ module BABYLON {
         public init(scene: Scene): void {
             this._scene = scene;
             this._scene.registerAfterRender(this._afterRender);
-            var blobURL = URL.createObjectURL(new Blob([BABYLON.CollisionWorker], { type: 'application/javascript' }));
-            this._worker = new Worker(blobURL);
+            var workerUrl = BABYLON.WorkerIncluded ? "./Collisions/babylon.collisionWorker.js" : URL.createObjectURL(new Blob([BABYLON.CollisionWorker], { type: 'application/javascript' }));
+            this._worker = new Worker(workerUrl);
             this._worker.onmessage = this._onMessageFromWorker;
             var message: BabylonMessage = {
                 payload: {},

+ 33 - 20
Babylon/Collisions/babylon.collisionWorker.js

@@ -1,5 +1,7 @@
 var BABYLON;
 (function (BABYLON) {
+    //If this file is included in the main thread, this will be initialized.
+    BABYLON.WorkerIncluded = true;
     var CollisionCache = (function () {
         function CollisionCache() {
             this._meshes = {};
@@ -188,26 +190,37 @@ var BABYLON;
         return CollisionDetectorTransferable;
     })();
     BABYLON.CollisionDetectorTransferable = CollisionDetectorTransferable;
-    //check if we are in a web worker, as this code should NOT run on the main UI thread
-    if (self && self instanceof WorkerGlobalScope) {
-        //Window hack to allow including babylonjs native code. the <any> is for typescript.
-        window = {};
-        var collisionDetector = new CollisionDetectorTransferable();
-        var onNewMessage = function (event) {
-            var message = event.data;
-            switch (message.taskType) {
-                case 0 /* INIT */:
-                    collisionDetector.onInit(message.payload);
-                    break;
-                case 2 /* COLLIDE */:
-                    collisionDetector.onCollision(message.payload);
-                    break;
-                case 1 /* UPDATE */:
-                    collisionDetector.onUpdate(message.payload);
-                    break;
+    try {
+        if (self && self instanceof WorkerGlobalScope) {
+            //Window hack to allow including babylonjs native code. the <any> is for typescript.
+            window = {};
+            //scripts were not included, standalone worker
+            if (!BABYLON.Collider) {
+                importScripts("./babylon.collisionCoordinator.js");
+                importScripts("./babylon.collider.js");
+                importScripts("../Math/babylon.math.js");
             }
-        };
-        self.onmessage = onNewMessage;
+            var collisionDetector = new CollisionDetectorTransferable();
+            var onNewMessage = function (event) {
+                var message = event.data;
+                switch (message.taskType) {
+                    case 0 /* INIT */:
+                        collisionDetector.onInit(message.payload);
+                        break;
+                    case 2 /* COLLIDE */:
+                        collisionDetector.onCollision(message.payload);
+                        break;
+                    case 1 /* UPDATE */:
+                        collisionDetector.onUpdate(message.payload);
+                        break;
+                }
+            };
+            self.onmessage = onNewMessage;
+        }
+    }
+    catch (e) {
+        console.log("single worker init");
     }
 })(BABYLON || (BABYLON = {}));
-//# sourceMappingURL=babylon.collisionWorker.js.map
+
+//# sourceMappingURL=../Collisions/babylon.collisionWorker.js.map

+ 35 - 22
Babylon/Collisions/babylon.collisionWorker.ts

@@ -1,5 +1,8 @@
 module BABYLON {
 
+    //If this file is included in the main thread, this will be initialized.
+    export var WorkerIncluded: boolean = true;
+
     export class CollisionCache {
         private _meshes: { [n: number]: SerializedMesh; } = {};
         private _geometries: { [s: number]: SerializedGeometry; } = {};
@@ -228,29 +231,39 @@ module BABYLON {
     declare class WorkerGlobalScope { }
 
     //check if we are in a web worker, as this code should NOT run on the main UI thread
-    if (self && self instanceof WorkerGlobalScope) {
-
-        //Window hack to allow including babylonjs native code. the <any> is for typescript.
-        window = <any> {};
-
-        var collisionDetector: ICollisionDetector = new CollisionDetectorTransferable();
-
-        var onNewMessage = function (event: MessageEvent) {
-            var message = <BabylonMessage> event.data;
-            switch (message.taskType) {
-                case WorkerTaskType.INIT:
-                    collisionDetector.onInit(<InitPayload> message.payload);
-                    break;
-                case WorkerTaskType.COLLIDE:
-                    collisionDetector.onCollision(<CollidePayload> message.payload);
-                    break;
-                case WorkerTaskType.UPDATE:
-                    collisionDetector.onUpdate(<UpdatePayload> message.payload);
-                    break;
+    try {
+        if (self && self instanceof WorkerGlobalScope) {
+
+            //Window hack to allow including babylonjs native code. the <any> is for typescript.
+            window = <any> {};
+
+            //scripts were not included, standalone worker
+            if (!BABYLON.Collider) {
+                importScripts("./babylon.collisionCoordinator.js");
+                importScripts("./babylon.collider.js");
+                importScripts("../Math/babylon.math.js");
             }
-        }
 
-        self.onmessage = onNewMessage;
-    }
+            var collisionDetector: ICollisionDetector = new CollisionDetectorTransferable();
+
+            var onNewMessage = function (event: MessageEvent) {
+                var message = <BabylonMessage> event.data;
+                switch (message.taskType) {
+                    case WorkerTaskType.INIT:
+                        collisionDetector.onInit(<InitPayload> message.payload);
+                        break;
+                    case WorkerTaskType.COLLIDE:
+                        collisionDetector.onCollision(<CollidePayload> message.payload);
+                        break;
+                    case WorkerTaskType.UPDATE:
+                        collisionDetector.onUpdate(<UpdatePayload> message.payload);
+                        break;
+                }
+            }
 
+            self.onmessage = onNewMessage;
+        }
+    } catch (e) {
+        console.log("single worker init");
+    }
 }

+ 2 - 2
Babylon/babylon.scene.js

@@ -141,8 +141,8 @@ var BABYLON;
             this.mainSoundTrack = new BABYLON.SoundTrack(this, { mainTrack: true });
             //simplification queue
             this.simplificationQueue = new BABYLON.SimplificationQueue();
-            //collision coordinator initialization.
-            this.workerCollisions = (!!Worker && !!BABYLON.CollisionWorker);
+            //collision coordinator initialization. For now legacy per default.
+            this.workerCollisions = false; //(!!Worker && (!!BABYLON.CollisionWorker || BABYLON.WorkerIncluded));
         }
         Object.defineProperty(Scene, "FOGMODE_NONE", {
             get: function () {

+ 2 - 2
Babylon/babylon.scene.ts

@@ -291,8 +291,8 @@
 
             //simplification queue
             this.simplificationQueue = new SimplificationQueue();
-            //collision coordinator initialization.
-            this.workerCollisions = (!!Worker && !!BABYLON.CollisionWorker);
+            //collision coordinator initialization. For now legacy per default.
+            this.workerCollisions = false; //(!!Worker && (!!BABYLON.CollisionWorker || BABYLON.WorkerIncluded));
         }
 
         // Properties 

+ 1 - 1
Tools/Gulp/config.json

@@ -153,8 +153,8 @@
         {
             "variable" : "BABYLON.CollisionWorker",
             "files" : [	
-                "../../Babylon/Collisions/babylon.collisionWorker.js",
                 "../../Babylon/Collisions/babylon.collider.js",
+                "../../Babylon/Collisions/babylon.collisionWorker.js",
                 "../../Babylon/Collisions/babylon.collisionCoordinator.js",
                 "../../Babylon/Math/babylon.math.js"
             ]