Browse Source

Merge pull request #497 from RaananW/standalone-worker

Worker can be in a single file
David Catuhe 10 years ago
parent
commit
654c53cc5a

+ 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"
             ]