Browse Source

SoftwareRenderer: Added support for FaceColors.

Mr.doob 12 years ago
parent
commit
2bea59fa73
2 changed files with 43 additions and 40 deletions
  1. 42 39
      examples/js/renderers/SoftwareRenderer.js
  2. 1 1
      examples/software_sandbox.html

+ 42 - 39
examples/js/renderers/SoftwareRenderer.js

@@ -131,7 +131,7 @@ THREE.SoftwareRenderer = function () {
 					element.v1.positionScreen,
 					element.v2.positionScreen,
 					element.v3.positionScreen,
-					shader, material
+					shader, element, material
 				)
 
 			} else if ( element instanceof THREE.RenderableFace4 ) {
@@ -140,14 +140,14 @@ THREE.SoftwareRenderer = function () {
 					element.v1.positionScreen,
 					element.v2.positionScreen,
 					element.v4.positionScreen,
-					shader, material
+					shader, element, material
 				);
 
 				drawTriangle(
 					element.v2.positionScreen,
 					element.v3.positionScreen,
 					element.v4.positionScreen,
-					shader, material
+					shader, element, material
 				);
 
 			}
@@ -193,41 +193,44 @@ THREE.SoftwareRenderer = function () {
 
 		if ( shaders[ id ] === undefined ) {
 
-			if ( material instanceof THREE.MeshBasicMaterial ) {
-
-				shader = new Function(
-						'buffer, offset, u, v, material',
-						[
-							'buffer[ offset ] = material.color.r * 255;',
-							'buffer[ offset + 1 ] = material.color.g * 255;',
-							'buffer[ offset + 2 ] = material.color.b * 255;',
-							'buffer[ offset + 3 ] = material.opacity * 255;',
-						].join('\n')
-					);
-
-			} else if ( material instanceof THREE.MeshLambertMaterial ) {
-
-				shader = new Function(
-						'buffer, offset, u, v, material',
-						[
-							'buffer[ offset ] = material.color.r * 255;',
-							'buffer[ offset + 1 ] = material.color.g * 255;',
-							'buffer[ offset + 2 ] = material.color.b * 255;',
-							'buffer[ offset + 3 ] = material.opacity * 255;',
-						].join('\n')
-					);
+			if ( material instanceof THREE.MeshBasicMaterial ||
+			     material instanceof THREE.MeshLambertMaterial ||
+			     material instanceof THREE.MeshPhongMaterial ) {
+
+				var string;
+
+				if ( material.vertexColors === THREE.FaceColors ) {
+
+					string = [
+						'buffer[ offset ] = face.color.r * 255;',
+						'buffer[ offset + 1 ] = face.color.g * 255;',
+						'buffer[ offset + 2 ] = face.color.b * 255;',
+						'buffer[ offset + 3 ] = material.opacity * 255;',
+					].join('\n');
+
+				} else {
+
+					string = [
+						'buffer[ offset ] = material.color.r * 255;',
+						'buffer[ offset + 1 ] = material.color.g * 255;',
+						'buffer[ offset + 2 ] = material.color.b * 255;',
+						'buffer[ offset + 3 ] = material.opacity * 255;',
+					].join('\n');
+
+				}
+
+				shader = new Function( 'buffer, offset, u, v, face, material', string );
 
 			} else {
 
-				shader = new Function(
-						'buffer, offset, u, v',
-						[
-							'buffer[ offset ] = u * 255;',
-							'buffer[ offset + 1 ] = v * 255;',
-							'buffer[ offset + 2 ] = 0;',
-							'buffer[ offset + 3 ] = 255;'
-						].join('\n')
-					);
+				var string = [
+					'buffer[ offset ] = u * 255;',
+					'buffer[ offset + 1 ] = v * 255;',
+					'buffer[ offset + 2 ] = 0;',
+					'buffer[ offset + 3 ] = 255;'
+				].join('\n');
+
+				shader = new Function( 'buffer, offset, u, v', string );
 
 			}
 
@@ -246,7 +249,7 @@ THREE.SoftwareRenderer = function () {
 		var ymin = Math.max( Math.min( y1, y2 ), 0 );
 		var ymax = Math.min( Math.max( y1, y2 ), canvasHeight );
 
-		var offset = ( xmin + ymin * canvasWidth - 1 ) * 4 + 3;
+		var offset = ( xmin + ymin * canvasWidth ) * 4 + 3;
 		var linestep = ( canvasWidth - ( xmax - xmin ) ) * 4;
 
 		for ( var y = ymin; y < ymax; y ++ ) {
@@ -263,7 +266,7 @@ THREE.SoftwareRenderer = function () {
 
 	}
 
-	function drawTriangle( v1, v2, v3, shader, material ) {
+	function drawTriangle( v1, v2, v3, shader, face, material ) {
 
 		// TODO: Implement per-pixel z-clipping
 
@@ -458,7 +461,7 @@ THREE.SoftwareRenderer = function () {
 								zbuffer[ offset ] = z;
 								var u = cx1 * scale;
 								var v = cx2 * scale;
-								shader( data, offset * 4, u, v, material );
+								shader( data, offset * 4, u, v, face, material );
 							}
 
 							cx1 += dy12;
@@ -500,7 +503,7 @@ THREE.SoftwareRenderer = function () {
 									var v = cx2 * scale;
 
 									zbuffer[ offset ] = z;
-									shader( data, offset * 4, u, v, material );
+									shader( data, offset * 4, u, v, face, material );
 
 								}
 

+ 1 - 1
examples/software_sandbox.html

@@ -45,7 +45,7 @@
 				info.style.top = '10px';
 				info.style.width = '100%';
 				info.style.textAlign = 'center';
-				info.innerHTML = '<a href="https://github.com/mrdoob/three.js/" target="_blank">three.js<a/> - software renderer<br/>drag to change the point of view';
+				info.innerHTML = '<a href="http://threejs.org" target="_blank">three.js<a/> - software renderer<br/>drag to change the point of view';
 				container.appendChild( info );
 
 				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );