Browse Source

SoftwareRenderer2: Interpolants code working.
Need to clean up/benchmark.

Mr.doob 13 years ago
parent
commit
8c3f52062c
2 changed files with 139 additions and 2 deletions
  1. 138 1
      examples/js/renderers/SoftwareRenderer2.js
  2. 1 1
      examples/misc_software.html

+ 138 - 1
examples/js/renderers/SoftwareRenderer2.js

@@ -64,7 +64,7 @@ THREE.SoftwareRenderer2 = function () {
 		var renderData = projector.projectScene( scene, camera );
 		var elements = renderData.elements;
 
-		elements.sort( function painterSort( a, b ) { return a.z - b.z; } );
+		elements.sort( painterSort );
 
 		for ( var e = 0, el = elements.length; e < el; e ++ ) {
 
@@ -135,6 +135,12 @@ THREE.SoftwareRenderer2 = function () {
 
 	};
 
+	function painterSort( a, b ) {
+
+		return a.z - b.z;
+
+	}
+
 	function drawPixel( x, y, r, g, b ) {
 
 		var offset = ( x + y * canvasWidth ) * 4;
@@ -261,6 +267,137 @@ THREE.SoftwareRenderer2 = function () {
 
 	}
 
+	/*
+	function drawTriangleColor3( x1, y1, x2, y2, x3, y3, color1, color2, color3 ) {
+
+		// http://devmaster.net/forums/topic/1145-advanced-rasterization/
+
+		var r1 = color1 >> 16 & 255;
+		var r2 = color2 >> 16 & 255;
+		var r3 = color3 >> 16 & 255;
+
+		var g1 = color1 >> 8 & 255;
+		var g2 = color2 >> 8 & 255;
+		var g3 = color3 >> 8 & 255;
+
+		var b1 = color1 & 255;
+		var b2 = color2 & 255;
+		var b3 = color3 & 255;
+
+		var deltasr = computeDelta( x1, y1, r1, x2, y2, r2, x3, y3, r3 );
+		var deltasg = computeDelta( x1, y1, g1, x2, y2, g2, x3, y3, g3 );
+		var deltasb = computeDelta( x1, y1, b1, x2, y2, b2, x3, y3, b3 );
+
+		// 28.4 fixed-point coordinates
+
+		var X1 = Math.round( 16 * x1 );
+		var X2 = Math.round( 16 * x2 );
+		var X3 = Math.round( 16 * x3 );
+
+		var Y1 = Math.round( 16 * y1 );
+		var Y2 = Math.round( 16 * y2 );
+		var Y3 = Math.round( 16 * y3 );
+
+		// Deltas
+
+		var dx12 = X1 - X2;
+		var dx23 = X2 - X3;
+		var dx31 = X3 - X1;
+
+		var dy12 = Y1 - Y2;
+		var dy23 = Y2 - Y3;
+		var dy31 = Y3 - Y1;
+
+		// Fixed-point deltas
+
+		var fdx = [ dx12 << 4, dx23 << 4, dx31 << 4 ];
+		var fdy = [ dy12 << 4, dy23 << 4, dy31 << 4 ];
+
+		// Bounding rectangle
+
+		var minx = Math.max( ( Math.min( X1, X2, X3 ) + 0xf ) >> 4, 0 );
+		var maxx = Math.min( ( Math.max( X1, X2, X3 ) + 0xf ) >> 4, canvasWidth );
+		var miny = Math.max( ( Math.min( Y1, Y2, Y3 ) + 0xf ) >> 4, 0 );
+		var maxy = Math.min( ( Math.max( Y1, Y2, Y3 ) + 0xf ) >> 4, canvasHeight );
+
+		// Constant part of half-edge functions
+
+		var c1 = dy12 * X1 - dx12 * Y1;
+		var c2 = dy23 * X2 - dx23 * Y2;
+		var c3 = dy31 * X3 - dx31 * Y3;
+
+		// Correct for fill convention
+
+		if ( dy12 < 0 || ( dy12 == 0 && dx12 > 0 ) ) c1 ++;
+		if ( dy23 < 0 || ( dy23 == 0 && dx23 > 0 ) ) c2 ++;
+		if ( dy31 < 0 || ( dy31 == 0 && dx31 > 0 ) ) c3 ++;
+
+		var cy1 = c1 + dx12 * ( miny << 4 ) - dy12 * ( minx << 4 );
+		var cy2 = c2 + dx23 * ( miny << 4 ) - dy23 * ( minx << 4 );
+		var cy3 = c3 + dx31 * ( miny << 4 ) - dy31 * ( minx << 4 );
+
+		// Scan through bounding rectangle
+
+		var minyx1 = ( minx - x1 );
+		var minyy1 = ( miny - y1 );
+
+		var ry = deltasr[ 1 ] * minyy1;
+		var gy = deltasg[ 1 ] * minyy1;
+		var by = deltasb[ 1 ] * minyy1;
+
+		for ( var y = miny; y < maxy; y ++ ) {
+
+			// Start value for horizontal scan
+
+			var cx1 = cy1;
+			var cx2 = cy2;
+			var cx3 = cy3;
+
+			var rx = deltasr[ 0 ] * minyx1 + ry;
+			var gx = deltasg[ 0 ] * minyx1 + gy;
+			var bx = deltasb[ 0 ] * minyx1 + by;
+
+			for ( var x = minx; x < maxx; x ++ ) {
+
+				if ( cx1 > 0 && cx2 > 0 && cx3 > 0 ) {
+
+					drawPixel( x, y, r1 + rx, g1 + gx, b1 + bx );
+
+				}
+
+				cx1 -= fdy[ 0 ];
+				cx2 -= fdy[ 1 ];
+				cx3 -= fdy[ 2 ];
+
+				rx += deltasr[ 0 ];
+				gx += deltasg[ 0 ];
+				bx += deltasb[ 0 ];
+
+			}
+
+			cy1 += fdx[ 0 ];
+			cy2 += fdx[ 1 ];
+			cy3 += fdx[ 2 ];
+
+			ry += deltasr[ 1 ];
+			gy += deltasg[ 1 ];
+			by += deltasb[ 1 ];
+
+		}
+
+	}
+
+	function computeDelta( x1, y1, z1, x2, y2, z2, x3, y3, z3 ) {
+
+		var A = (z3 - z1) * (y2 - y1) - (z2 - z1) * (y3 - y1);
+		var B = (x3 - x1) * (z2 - z1) - (x2 - x1) * (z3 - z1);
+		var C = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
+
+		return [ - A / C, - B / C ];
+
+	}
+	*/
+
 	function normalToComponent( normal ) {
 
 		var component = ( normal + 1 ) * 127;

+ 1 - 1
examples/misc_software.html

@@ -55,7 +55,7 @@
 
 				controls = new THREE.TrackballControls( camera );
 				
-				sphere = new THREE.Mesh( new THREE.IcosahedronGeometry( 150, 1 ), new THREE.MeshBasicMaterial() );
+				sphere = new THREE.Mesh( new THREE.IcosahedronGeometry( 150, 3 ), new THREE.MeshBasicMaterial() );
 				scene.add( sphere );
 
 				// Plane