Browse Source

Raytracing Workers: Fix proper scene distribution to workers

Joshua Koo 9 years ago
parent
commit
d8ce4b7c52

+ 17 - 15
examples/js/renderers/RaytracingWorker.js

@@ -22,8 +22,6 @@ self.onmessage = function( e ) {
 		worker = data.worker;
 		worker = data.worker;
 		workers = data.workers;
 		workers = data.workers;
 		BLOCK = data.blockSize;
 		BLOCK = data.blockSize;
-		eval( data.initScene );
-		initScene( width, height );
 
 
 		renderer = new THREE.RaytracingRendererWorker();
 		renderer = new THREE.RaytracingRendererWorker();
 		loader = new THREE.ObjectLoader();
 		loader = new THREE.ObjectLoader();
@@ -41,11 +39,25 @@ self.onmessage = function( e ) {
 		scene = loader.parse( data.scene );
 		scene = loader.parse( data.scene );
 		camera = loader.parse( data.camera );
 		camera = loader.parse( data.camera );
 
 
-		var positions = data.positions;
-		copyPositions( camera, positions );
+		var meta = data.annex;
 		scene.traverse( function( o ) {
 		scene.traverse( function( o ) {
 
 
-			copyPositions( o, positions );
+			if ( o instanceof THREE.PointLight ) {
+
+				o.physicalAttenuation = true;
+
+			}
+
+			var mat = o.material;
+
+			if (!mat) return;
+
+			var material = meta[ mat.uuid ];
+			for (var m in material) {
+
+				mat[ m ] = material[ m ];
+
+			}
 
 
 		} );
 		} );
 
 
@@ -61,16 +73,6 @@ self.onmessage = function( e ) {
 
 
 }
 }
 
 
-function copyPositions( object, positions ) {
-
-	var info = positions[ object.uuid ];
-
-	object.position.fromArray( info.position );
-	object.scale.fromArray( info.scale );
-	object.rotation.fromArray( info.rotation );
-
-}
-
 /**
 /**
  * DOM-less version of Raytracing Renderer
  * DOM-less version of Raytracing Renderer
  * @author mrdoob / http://mrdoob.com/
  * @author mrdoob / http://mrdoob.com/

+ 43 - 18
examples/js/renderers/RaytracingWorkerRenderer.js

@@ -144,8 +144,7 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 				init: [ width, height ],
 				init: [ width, height ],
 				worker: i,
 				worker: i,
 				workers: pool.length,
 				workers: pool.length,
-				blockSize: blockSize,
-				initScene: initScene.toString()
+				blockSize: blockSize
 
 
 			} );
 			} );
 
 
@@ -188,34 +187,60 @@ THREE.RaytracingWorkerRenderer = function ( parameters ) {
 
 
 	}
 	}
 
 
-	var all = {};
+	var materials = {};
+
+	var _annex = {
+		mirror: 1,
+		reflectivity: 1,
+		refractionRatio: 1,
+		glass: 1,
+		vertexColors: 1,
+		shading: 1
+	};
+
 	function serializeObject( o ) {
 	function serializeObject( o ) {
 
 
-		all[ o.uuid ] = {
-			position: o.position.toArray(),
-			rotation: o.rotation.toArray(),
-			scale: o.scale.toArray()
+		var mat = o.material;
+
+		if ( ! mat || mat.uuid in materials ) return;
+
+		console.log(mat);
+
+		var props = {};
+		for (var m in _annex) {
+			if ( mat[m] !== undefined ) {
+				props[ m ] = mat[ m ];
+			}
 		}
 		}
 
 
+		materials[ mat.uuid ] = props;
 	}
 	}
 
 
 	this.render = function ( scene, camera ) {
 	this.render = function ( scene, camera ) {
 
 
 		renderering = true;
 		renderering = true;
 
 
-		// var sceneJSON = scene.toJSON();
-		// var cameraJSON = camera.toJSON();
+		// update scene graph
+
+		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
+
+		// update camera matrices
+
+		if ( camera.parent === null ) camera.updateMatrixWorld();
+
+
+		var sceneJSON = scene.toJSON();
+		var cameraJSON = camera.toJSON();
 
 
-		// scene.traverse( serializeObject );
-		// serializeObject( camera );
+		scene.traverse( serializeObject );
 
 
-		// pool.forEach(function(worker) {
-		// 	worker.postMessage({
-		// 		scene: sceneJSON,
-		// 		camera: cameraJSON,
-		// 		positions: all
-		// 	});
-		// });
+		pool.forEach(function(worker) {
+			worker.postMessage({
+				scene: sceneJSON,
+				camera: cameraJSON,
+				annex: materials
+			});
+		});
 
 
 		context.clearRect( 0, 0, canvasWidth, canvasHeight );
 		context.clearRect( 0, 0, canvasWidth, canvasHeight );
 		reallyThen = Date.now();
 		reallyThen = Date.now();