Browse Source

Deferred shading: added support for MeshFaceMaterials.

alteredq 12 years ago
parent
commit
cd4218f1bb

+ 46 - 7
examples/js/DeferredHelper.js

@@ -65,7 +65,44 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	var initDeferredMaterials = function ( object ) {
 
-		var originalMaterial = object.material;
+		if ( object.material instanceof THREE.MeshFaceMaterial ) {
+
+			var colorMaterials = [];
+			var depthMaterials = [];
+			var normalMaterials = [];
+
+			var materials = object.material.materials;
+
+			for ( var i = 0, il = materials.length; i < il; i ++ ) {
+
+				var deferredMaterials = createDeferredMaterials( materials[ i ] );
+
+				colorMaterials.push( deferredMaterials.colorMaterial );
+				depthMaterials.push( deferredMaterials.depthMaterial );
+				normalMaterials.push( deferredMaterials.normalMaterial );
+
+			}
+
+			object.properties.colorMaterial = new THREE.MeshFaceMaterial( colorMaterials );
+			object.properties.depthMaterial = new THREE.MeshFaceMaterial( depthMaterials );
+			object.properties.normalMaterial = new THREE.MeshFaceMaterial( normalMaterials );
+
+		} else {
+
+			var deferredMaterials = createDeferredMaterials( object.material );
+
+			object.properties.colorMaterial = deferredMaterials.colorMaterial;
+			object.properties.depthMaterial = deferredMaterials.depthMaterial;
+			object.properties.normalMaterial = deferredMaterials.normalMaterial;
+
+		}
+
+	};
+
+
+	var createDeferredMaterials = function ( originalMaterial ) {
+
+		var deferredMaterials = {};
 
 		// color material
 		// -----------------
@@ -127,7 +164,7 @@ THREE.DeferredHelper = function ( parameters ) {
 
 		}
 
-		object.properties.colorMaterial = material;
+		deferredMaterials.colorMaterial = material;
 
 		// normal material
 		// -----------------
@@ -157,7 +194,7 @@ THREE.DeferredHelper = function ( parameters ) {
 
 			uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
 
-			object.properties.normalMaterial = normalMaterial;
+			deferredMaterials.normalMaterial = normalMaterial;
 
 		} else if ( originalMaterial.morphTargets ) {
 
@@ -173,11 +210,11 @@ THREE.DeferredHelper = function ( parameters ) {
 			normalMaterial.morphTargets = originalMaterial.morphTargets;
 			normalMaterial.morphNormals = originalMaterial.morphNormals;
 
-			object.properties.normalMaterial = normalMaterial;
+			deferredMaterials.normalMaterial = normalMaterial;
 
 		} else {
 
-			object.properties.normalMaterial = defaultNormalMaterial;
+			deferredMaterials.normalMaterial = defaultNormalMaterial;
 
 		}
 
@@ -195,14 +232,16 @@ THREE.DeferredHelper = function ( parameters ) {
 
 			depthMaterial.morphTargets = originalMaterial.morphTargets;
 
-			object.properties.depthMaterial = depthMaterial;
+			deferredMaterials.depthMaterial = depthMaterial;
 
 		} else {
 
-			object.properties.depthMaterial = defaultDepthMaterial;
+			deferredMaterials.depthMaterial = defaultDepthMaterial;
 
 		}
 
+		return deferredMaterials;
+
 	};
 
 	var createDeferredPointLight = function ( light ) {

+ 6 - 18
examples/webgl_lights_deferred_morphs.html

@@ -169,16 +169,6 @@
 			}
 
 
-			// -----------------------------
-
-			function addObject( object, y, scale ) {
-
-				object.position.y = y;
-				object.scale.set( scale, scale, scale );
-				scene.add( object );
-
-			}
-
 			// -----------------------------
 
 			function initLights() {
@@ -242,22 +232,20 @@
 					meshAnim.duration = 3000;
 					meshAnim.properties.delta = -13;
 
-					var s = 1;
-					meshAnim.scale.set( s, s, s );
-					meshAnim.position.x = 180;
-					meshAnim.position.z = -10;
+					meshAnim.scale.multiplyScalar( 50 );
+					meshAnim.position.set( 180, -48, -10 );
 					meshAnim.rotation.y = -Math.PI/2;
 
+					scene.add( meshAnim );
 					morphs.push( meshAnim );
 
-					addObject( meshAnim, -48, 50 );
-
 				} );
 
 				// add box
 
-				var object = generateBox();
-				addObject( object, 0, 8 );
+				var box = generateBox();
+				box.scale.multiplyScalar( 8 );
+				scene.add( box );
 
 			}
 

+ 37 - 18
examples/webgl_lights_deferred_pointlights.html

@@ -170,17 +170,6 @@
 
 			// -----------------------------
 
-			function addObject( object, y, scale ) {
-
-				object.position.y = y;
-				object.scale.set( scale, scale, scale );
-
-				scene.add( object );
-
-			}
-
-			// -----------------------------
-
 			function initLights() {
 
 				var distance = 40;
@@ -237,20 +226,22 @@
 
 				loader.load( "models/utf8/ben_dds.js", function ( object ) {
 
-					addObject( object, -75, 150 );
-					animate();
+					object.scale.multiplyScalar( 150 );
+					object.position.y = -75;
+					scene.add( object );
 
 				}, { normalizeRGB: true } );
 
 				loader.load( "models/utf8/WaltHi.js", function ( object ) {
 
-					addObject( object, -35, 1 );
-					animate();
+					object.position.y = -35;
+					scene.add( object );
 
 				}, { normalizeRGB: true } );
 
 				*/
 
+
 				var loader = new THREE.JSONLoader();
 				loader.load( "obj/leeperrysmith/LeePerrySmith.js", function( geometry, materials ) {
 
@@ -265,14 +256,42 @@
 					var material = new THREE.MeshPhongMaterial( { map: mapColor, bumpMap: mapHeight, bumpScale: 2.5, shininess: 75, specular: 0x090909 } );
 
 					var object = new THREE.Mesh( geometry, material );
-					addObject( object, 0, 8 );
+					object.scale.multiplyScalar( 8 );
+					scene.add( object );
+
+				} );
+
+
+				var loader = new THREE.BinaryLoader();
+				loader.load( "obj/female02/Female02_bin.js", function( geometry, materials ) {
+
+					var material = new THREE.MeshPhongMaterial( { shininess: 175, specular: 0x999999 } );
+
+					var object = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
+					object.position.x = -50;
+					object.position.y = -48;
+					object.scale.multiplyScalar( 0.45 );
+					scene.add( object );
+
+				} );
+
+				loader.load( "obj/male02/Male02_bin.js", function( geometry, materials ) {
+
+					var material = new THREE.MeshPhongMaterial( { shininess: 175, specular: 0x999999 } );
+
+					var object = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
+					object.position.x = 50;
+					object.position.y = -48;
+					object.scale.multiplyScalar( 0.45 );
+					scene.add( object );
 
 				} );
 
 				// create box
 
-				var object = generateBox();
-				addObject( object, 0, 8 );
+				var box = generateBox();
+				box.scale.multiplyScalar( 8 );
+				scene.add( box );
 
 			}