|
@@ -6,7 +6,6 @@
|
|
|
*
|
|
|
* TODO
|
|
|
* - serialize scene and hand it to workers
|
|
|
- * - renderer thread to hand block jobs to workers
|
|
|
* - pass worker path as option
|
|
|
*
|
|
|
* @author zz85 / http://github.com/zz85
|
|
@@ -43,7 +42,9 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
|
|
|
console.log('%cSpinning off ' + workers + ' Workers ', 'font-size: 20px; background: black; color: white; font-family: monospace;');
|
|
|
|
|
|
for (var i = 0; i < workers; i++) {
|
|
|
+
|
|
|
var worker = new Worker('js/renderers/RaytracingWorker.js');
|
|
|
+
|
|
|
worker.onmessage = function(e) {
|
|
|
var data = e.data;
|
|
|
|
|
@@ -54,13 +55,18 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
|
|
|
var imagedata = new ImageData(new Uint8ClampedArray(d), data.blockSize, data.blockSize);
|
|
|
context.putImageData( imagedata, data.blockX, data.blockY );
|
|
|
} else if (data.type == 'complete') {
|
|
|
- // TODO can terminate worker here or schedule more other jobs...
|
|
|
+ // TODO can terminate workers after all is done?
|
|
|
+ console.log('Worker ' + data.worker, data.time / 1000, (Date.now() - reallyThen) / 1000 + ' s');
|
|
|
+
|
|
|
+ renderNext(this);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ worker.color = new THREE.Color().setHSL(i / workers, 0.8, 0.8).getHexString();
|
|
|
pool.push(worker);
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
this.setClearColor = function ( color, alpha ) {
|
|
|
|
|
@@ -107,14 +113,39 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
|
|
|
|
|
|
//
|
|
|
|
|
|
+ var nextBlock, totalBlocks, xblocks, yblocks;
|
|
|
+
|
|
|
+ function renderNext(worker) {
|
|
|
+ var current = nextBlock++;
|
|
|
+ if (nextBlock > totalBlocks) {
|
|
|
+ return scope.dispatchEvent( { type: "complete" } );
|
|
|
+ }
|
|
|
+
|
|
|
+ var blockX = (current % xblocks) * blockSize;
|
|
|
+ var blockY = (current / xblocks | 0) * blockSize;
|
|
|
+
|
|
|
+ worker.postMessage({
|
|
|
+ render: true,
|
|
|
+ x: blockX,
|
|
|
+ y: blockY
|
|
|
+ });
|
|
|
+
|
|
|
+ context.fillStyle = '#' + worker.color;
|
|
|
+
|
|
|
+ context.fillRect( blockX, blockY, blockSize, blockSize );
|
|
|
+ }
|
|
|
+
|
|
|
this.render = function ( scene, camera ) {
|
|
|
+
|
|
|
+ context.clearRect( 0, 0, canvasWidth, canvasHeight );
|
|
|
reallyThen = Date.now();
|
|
|
|
|
|
- pool.forEach(function(p) {
|
|
|
- p.postMessage({
|
|
|
- render: true
|
|
|
- })
|
|
|
- });
|
|
|
+ xblocks = Math.ceil(canvasWidth / blockSize);
|
|
|
+ yblocks = Math.ceil(canvasHeight / blockSize);
|
|
|
+ nextBlock = 0;
|
|
|
+ totalBlocks = xblocks * yblocks;
|
|
|
+
|
|
|
+ pool.forEach(renderNext);
|
|
|
|
|
|
};
|
|
|
|