Browse Source

Raytracing Workers: randomize raytracing jobs

Joshua Koo 9 years ago
parent
commit
cb61c5b3f4

+ 4 - 3
examples/js/renderers/RaytracingWorker.js

@@ -23,8 +23,9 @@ self.onmessage = function( e ) {
 		workers = data.workers;
 		workers = data.workers;
 		BLOCK = data.blockSize;
 		BLOCK = data.blockSize;
 
 
-		renderer = new THREE.RaytracingRendererWorker();
-		loader = new THREE.ObjectLoader();
+		if (!renderer) renderer = new THREE.RaytracingRendererWorker();
+		if (!loader) loader = new THREE.ObjectLoader();
+
 		renderer.setSize( width, height );
 		renderer.setSize( width, height );
 
 
 		// TODO fix passing maxRecursionDepth as parameter.
 		// TODO fix passing maxRecursionDepth as parameter.
@@ -82,7 +83,7 @@ self.onmessage = function( e ) {
 
 
 THREE.RaytracingRendererWorker = function ( parameters ) {
 THREE.RaytracingRendererWorker = function ( parameters ) {
 
 
-	console.log( 'THREE.RaytracingRenderer', THREE.REVISION );
+	console.log( 'THREE.RaytracingRendererWorker', THREE.REVISION );
 
 
 	parameters = parameters || {};
 	parameters = parameters || {};
 
 

+ 51 - 30
examples/js/renderers/RaytracingWorkerRenderer.js

@@ -39,6 +39,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 	var workers = parameters.workers;
 	var workers = parameters.workers;
 	var blockSize = parameters.blockSize || 64;
 	var blockSize = parameters.blockSize || 64;
+	var toRender = [], workerId = 0;
 
 
 	console.log( '%cSpinning off ' + workers + ' Workers ', 'font-size: 20px; background: black; color: white; font-family: monospace;' );
 	console.log( '%cSpinning off ' + workers + ' Workers ', 'font-size: 20px; background: black; color: white; font-family: monospace;' );
 
 
@@ -48,9 +49,12 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 		while ( pool.length < workers ) {
 		while ( pool.length < workers ) {
 
 
+			console.log( workers, pool.length );
+
 			var i = pool.length;
 			var i = pool.length;
 
 
 			var worker = new Worker( 'js/renderers/RaytracingWorker.js' );
 			var worker = new Worker( 'js/renderers/RaytracingWorker.js' );
+			worker.id = workerId++;
 
 
 			worker.onmessage = function( e ) {
 			worker.onmessage = function( e ) {
 
 
@@ -70,7 +74,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 					if ( pool.length > workers ) {
 					if ( pool.length > workers ) {
 
 
-						pool.splice( pool.indexOf( this ), 1 )
+						pool.splice( pool.indexOf( this ), 1 );
 						return this.terminate();
 						return this.terminate();
 
 
 					}
 					}
@@ -86,15 +90,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 			if ( renderering ) {
 			if ( renderering ) {
 
 
-				worker.postMessage( {
-
-					init: [ canvasWidth, canvasHeight ],
-					worker: i,
-					workers: pool.length,
-					blockSize: blockSize,
-					initScene: initScene.toString()
-
-				} );
+				updateSettings( worker );
 
 
 				renderNext( worker );
 				renderNext( worker );
 
 
@@ -137,18 +133,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 		context.fillStyle = 'white';
 		context.fillStyle = 'white';
 
 
-		pool.forEach( function( p, i ) {
-
-			p.postMessage( {
-
-				init: [ width, height ],
-				worker: i,
-				workers: pool.length,
-				blockSize: blockSize
-
-			} );
-
-		} );
+		pool.forEach( updateSettings );
 
 
 	};
 	};
 
 
@@ -160,18 +145,31 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 	//
 	//
 
 
-	var nextBlock, totalBlocks, xblocks, yblocks;
+	var totalBlocks, xblocks, yblocks;
 
 
-	function renderNext( worker ) {
+	function updateSettings( worker ) {
 
 
-		var current = nextBlock ++;
-		if ( nextBlock > totalBlocks ) {
+		worker.postMessage( {
+
+			init: [ canvasWidth, canvasHeight ],
+			worker: worker.id,
+			// workers: pool.length,
+			blockSize: blockSize
+
+		} );
+
+	}
+
+	function renderNext( worker ) {
+		if ( ! toRender.length ) {
 
 
 			renderering = false;
 			renderering = false;
 			return scope.dispatchEvent( { type: "complete" } );
 			return scope.dispatchEvent( { type: "complete" } );
 
 
 		}
 		}
 
 
+		var current = toRender.pop();
+
 		var blockX = ( current % xblocks ) * blockSize;
 		var blockX = ( current % xblocks ) * blockSize;
 		var blockY = ( current / xblocks | 0 ) * blockSize;
 		var blockY = ( current / xblocks | 0 ) * blockSize;
 
 
@@ -189,13 +187,15 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 	var materials = {};
 	var materials = {};
 
 
+	// additional properties that were not serialize automatically
+
 	var _annex = {
 	var _annex = {
+
 		mirror: 1,
 		mirror: 1,
 		reflectivity: 1,
 		reflectivity: 1,
 		refractionRatio: 1,
 		refractionRatio: 1,
 		glass: 1,
 		glass: 1,
-		vertexColors: 1,
-		shading: 1
+
 	};
 	};
 
 
 	function serializeObject( o ) {
 	function serializeObject( o ) {
@@ -207,7 +207,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 		var props = {};
 		var props = {};
 		for ( var m in _annex ) {
 		for ( var m in _annex ) {
 
 
-			if ( mat[m] !== undefined ) {
+			if ( mat[ m ] !== undefined ) {
 
 
 				props[ m ] = mat[ m ];
 				props[ m ] = mat[ m ];
 
 
@@ -249,9 +249,30 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 		xblocks = Math.ceil( canvasWidth / blockSize );
 		xblocks = Math.ceil( canvasWidth / blockSize );
 		yblocks = Math.ceil( canvasHeight / blockSize );
 		yblocks = Math.ceil( canvasHeight / blockSize );
-		nextBlock = 0;
 		totalBlocks = xblocks * yblocks;
 		totalBlocks = xblocks * yblocks;
 
 
+		toRender = [];
+
+		for ( var i = 0; i < totalBlocks; i ++ ) {
+
+			toRender.push( i );
+
+		}
+
+
+		// Randomize painting :)
+
+		for ( var i = 0; i < totalBlocks; i ++ ) {
+
+			var swap = Math.random()  * totalBlocks | 0;
+			var tmp = toRender[ swap ];
+			toRender[ swap ] = toRender[ i ];
+			toRender[ i ] = tmp;
+
+		}
+
+
+
 		pool.forEach( renderNext );
 		pool.forEach( renderNext );
 
 
 	};
 	};