Parcourir la source

Came up with a crazy approach to get Vertex Colors. Gouraud yet on step closer.
Changed the DepthMaterial to use this approach instead.

Mr.doob il y a 14 ans
Parent
commit
fe82bdbda9

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
build/Three.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
build/ThreeDebug.js


+ 5 - 4
examples/materials_depth.html

@@ -16,7 +16,7 @@
 
 		<script type="text/javascript" src="../build/Three.js"></script>
 
-		<script type="text/javascript" src="../src/extras/primitives/Sphere.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/Cube.js"></script>
 		<script type="text/javascript" src="../src/extras/primitives/Plane.js"></script>
 
 		<script type="text/javascript" src="js/Stats.js"></script>
@@ -77,12 +77,13 @@
 
 				plane = new THREE.Mesh( new Plane( 1000, 1000, 10, 10 ), material );
 				plane.rotation.x = - 90 * ( Math.PI / 180 );
+				plane.position.y = - 100;
 				plane.doubleSided = true;
 				scene.addObject( plane );
 
 				// Spheres
 
-				geometry = new Sphere( 100, 8, 4 );
+				geometry = new Cube( 100, 100, 100 );
 				//material = new THREE.MeshLambertMaterial( { color: 0xffffff } );
 				material = new THREE.MeshDepthMaterial( { near: 1, far: 2000 } );
 
@@ -128,7 +129,7 @@
 				scene.addLight( pointLight );
 
 				renderer = new THREE.CanvasRenderer();
-				//renderer = new THREE.WebGLRenderer();
+				// renderer = new THREE.WebGLRenderer();
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 				container.appendChild( renderer.domElement );
@@ -239,7 +240,7 @@
 
 					object.rotation.x += 0.01;
 					object.rotation.y += 0.005;
-					object.position.y = Math.sin( object.rotation.x ) * 200;
+					object.position.y = Math.sin( object.rotation.x ) * 200 + 200;
 
 					debugContext.rect( object.position.x * 0.1 - 5, object.position.z * 0.1 - 5, 10, 10 );
 

+ 0 - 84
examples/materials_depth2.html

@@ -1,84 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en">
-	<head>
-		<title>three.js - depth material</title>
-		<meta charset="utf-8">
-		<style type="text/css">
-			body {
-				background-color: #000000;
-				margin: 0px;
-				overflow: hidden;
-			}
-
-			#info {
-				position: absolute;
-				top: 0px; width: 100%;
-				color: #808080;
-				padding: 5px;
-				font-family: Monospace;
-				font-size: 13px;
-				text-align: center;
-			}
-
-			a {
-				color: #ffffff;
-				text-decoration: none;
-			}
-
-			a:hover {
-				color: #0080ff;
-			}
-		</style>
-	</head>
-	<body>
-
-		<div id="container"></div>
-		<div id="info">
-			<a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - depth material.<br />
-			Walt Disney head by <a href="http://www.davidoreilly.com/2009/01/walt-disneys-head-on-a-plate" target="_blank">David OReilly</a>
-		</div>
-
-		<script type="text/javascript" src="../build/Three.js"></script> 
-		<script type="text/javascript" src="geometry/WaltHead.js"></script> 
-
-		<script type="text/javascript">
-
-			var camera, scene, renderer,
-			object;
-
-			init();
-			setInterval( loop, 1000 / 60 );
-
-			function init() {
-
-				var container = document.getElementById( 'container' );
-
-				camera = new THREE.Camera( 50, window.innerWidth / window.innerHeight, 1, 1000 );
-				camera.position.z = 1000;
-
-				scene = new THREE.Scene();
-
-				object = new THREE.Mesh( new WaltHead(), new THREE.MeshDepthMaterial( { near: 1, far: 1000 } ) );
-				object.overdraw = true;
-				object.scale.x = object.scale.y = object.scale.z = 15;
-				scene.addObject( object );
-
-				renderer = new THREE.CanvasRenderer();
-				renderer.setSize( window.innerWidth, window.innerHeight );
-				container.appendChild( renderer.domElement );
-
-			}
-
-			function loop() {
-
-				var time = new Date().getTime() * 0.0005;
-
-				object.rotation.y -= 0.01;
-
-				renderer.render(scene, camera);
-
-			}
-
-		</script>
-	</body>
-</html>

+ 91 - 40
src/renderers/CanvasRenderer.js

@@ -23,6 +23,9 @@ THREE.CanvasRenderer = function () {
 	_v1x, _v1y, _v2x, _v2y, _v3x, _v3y,
 	_v4x, _v4y, _v5x, _v5y, _v6x, _v6y,
 
+	_color1, _color2, _color3, _color4,
+	_2near, _farPlusNear, _farMinusNear,
+
 	_bitmap, _bitmapWidth, _bitmapHeight,
 
 	_clipRect = new THREE.Rectangle(),
@@ -38,18 +41,27 @@ THREE.CanvasRenderer = function () {
 	_vector3 = new THREE.Vector3(), // Needed for PointLight
 	_uv1 = new THREE.UV(), _uv2 = new THREE.UV(), _uv3 = new THREE.UV(), _uv4 = new THREE.UV(),
 
-	_depthMap = document.createElement( 'canvas' ),
-	_depthMapContext = _depthMap.getContext( '2d' ),
-	_depthMapGradient = _depthMapContext.createLinearGradient( 0, 0, 255, 0);
+	_pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData,
+	_gradientMap, _gradientMapContext, _gradientMapQuality = 32;
+
+	_pixelMap = document.createElement( 'canvas' );
+	_pixelMap.width = _pixelMap.height = 2;
+
+	_pixelMapContext = _pixelMap.getContext( '2d' );
+	_pixelMapContext.fillStyle = 'rgba(0,0,0,1)';
+	_pixelMapContext.fillRect( 0, 0, 2, 2 );
+
+	_pixelMapImage = _pixelMapContext.getImageData( 0, 0, 2, 2 );
+	_pixelMapData = _pixelMapImage.data;
 
-	_depthMap.width = 255;
-	_depthMap.height = 4;
+	_gradientMap = document.createElement( 'canvas' );
+	_gradientMap.width = _gradientMap.height = _gradientMapQuality;
 
-	_depthMapGradient.addColorStop( 0, "white" );
-	_depthMapGradient.addColorStop( 1, "black" );
+	_gradientMapContext = _gradientMap.getContext( '2d' );
+	_gradientMapContext.translate( - _gradientMapQuality / 2, - _gradientMapQuality / 2 );
+	_gradientMapContext.scale( _gradientMapQuality, _gradientMapQuality );
 
-	_depthMapContext.fillStyle = _depthMapGradient;
-	_depthMapContext.fillRect( 0, 0, 255, 4 );
+	_gradientMapQuality --; // Fix UVs
 
 	this.domElement = _canvas;
 	this.autoClear = true;
@@ -293,26 +305,6 @@ THREE.CanvasRenderer = function () {
 
 	};
 
-	function setBlending( blending ) {
-
-		switch( blending ) {
-
-			case 0: // THREE.NormalBlending
-				_context.globalCompositeOperation = "source-over";
-				break;
-			case 1: // THREE.AdditiveBlending
-				_context.globalCompositeOperation = "lighter";
-				break;
-			case 2: // THREE.SubtractiveBlending
-				_context.globalCompositeOperation = "darker";
-				break;
-
-		}
-
-		_contextGlobalCompositeOperation = blending;
-
-	}
-
 	function calculateAmbientLight( scene, color ) {
 
 		var l, ll, light, lightColor,
@@ -627,13 +619,20 @@ THREE.CanvasRenderer = function () {
 			_color.setRGBA( _w, _w, _w, 1 );
 			*/
 
-			_bitmap = _depthMap;
+			_2near = material.__2near;
+			_farPlusNear = material.__farPlusNear;
+			_farMinusNear = material.__farMinusNear;
+
+			_color1 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v1.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			_color2 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v2.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			_color3 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v3.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			// _color4 = ~~ ( ( _color2 + _color3 ) * 0.5 );
 
-			_uv1.u = ( material.__2near / (material.__farPlusNear - v1.positionScreen.z * material.__farMinusNear ) ) * 255;
-			_uv2.u = ( material.__2near / (material.__farPlusNear - v2.positionScreen.z * material.__farMinusNear ) ) * 255;
-			_uv3.u = ( material.__2near / (material.__farPlusNear - v3.positionScreen.z * material.__farMinusNear ) ) * 255;
+			_bitmap = getGradientTexture( [ _color1, _color1, _color1 ], [ _color2, _color2, _color2 ], [ _color3, _color3, _color3 ], [ _color3, _color3, _color3 ] );
 
-			_uv1.v = 0; _uv2.v = 1; _uv3.v = 2;
+			_uv1.u = 0; _uv1.v = 0; 
+			_uv2.u = _gradientMapQuality; _uv2.v = 0;
+			_uv3.u = 0; _uv3.v = _gradientMapQuality;
 
 			drawTexturedTriangle( _bitmap, _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1.u, _uv1.v, _uv2.u, _uv2.v, _uv3.u, _uv3.v );
 
@@ -723,14 +722,21 @@ THREE.CanvasRenderer = function () {
 			_color.setRGBA( _w, _w, _w, 1 );
 			*/
 
-			_bitmap = _depthMap;
+			_2near = material.__2near;
+			_farPlusNear = material.__farPlusNear;
+			_farMinusNear = material.__farMinusNear;
 
-			_uv1.u = ( material.__2near / (material.__farPlusNear - v1.positionScreen.z * material.__farMinusNear ) ) * 255;
-			_uv2.u = ( material.__2near / (material.__farPlusNear - v2.positionScreen.z * material.__farMinusNear ) ) * 255;
-			_uv3.u = ( material.__2near / (material.__farPlusNear - v3.positionScreen.z * material.__farMinusNear ) ) * 255;
-			_uv4.u = ( material.__2near / (material.__farPlusNear - v4.positionScreen.z * material.__farMinusNear ) ) * 255;
+			_color1 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v1.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			_color2 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v2.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			_color3 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v3.positionScreen.z * _farMinusNear ) ) ) * 255 );
+			_color4 = ~~ ( ( 1 - ( _2near / ( _farPlusNear - v4.positionScreen.z * _farMinusNear ) ) ) * 255 );
 
-			_uv1.v = 0; _uv2.v = 1; _uv3.v = 2; _uv4.v = 3;
+			_bitmap = getGradientTexture( [ _color1, _color1, _color1 ], [ _color2, _color2, _color2 ], [ _color4, _color4, _color4 ], [ _color3, _color3, _color3 ] );
+
+			_uv1.u = 0; _uv1.v = 0; 
+			_uv2.u = _gradientMapQuality; _uv2.v = 0;
+			_uv3.u = _gradientMapQuality; _uv3.v = _gradientMapQuality;
+			_uv4.u = 0; _uv4.v = _gradientMapQuality;
 
 			drawTexturedTriangle( _bitmap, _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, _uv1.u, _uv1.v, _uv2.u, _uv2.v, _uv4.u, _uv4.v );
 			drawTexturedTriangle( _bitmap, _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, _uv2.u, _uv2.v, _uv3.u, _uv3.v, _uv4.u, _uv4.v );
@@ -860,6 +866,51 @@ THREE.CanvasRenderer = function () {
 
 	}
 
+	function setBlending( blending ) {
+
+		switch( blending ) {
+
+			case 0: // THREE.NormalBlending
+				_context.globalCompositeOperation = "source-over";
+				break;
+			case 1: // THREE.AdditiveBlending
+				_context.globalCompositeOperation = "lighter";
+				break;
+			case 2: // THREE.SubtractiveBlending
+				_context.globalCompositeOperation = "darker";
+				break;
+
+		}
+
+		_contextGlobalCompositeOperation = blending;
+
+	}
+
+	function getGradientTexture( c1, c2, c3, c4 ) {
+
+		_pixelMapData[ 0 ] = c1[ 0 ];
+		_pixelMapData[ 1 ] = c1[ 1 ];
+		_pixelMapData[ 2 ] = c1[ 2 ];
+
+		_pixelMapData[ 4 ] = c2[ 0 ];
+		_pixelMapData[ 5 ] = c2[ 1 ];
+		_pixelMapData[ 6 ] = c2[ 2 ];
+
+		_pixelMapData[ 8 ] = c3[ 0 ];
+		_pixelMapData[ 9 ] = c3[ 1 ];
+		_pixelMapData[ 10 ] = c3[ 2 ];
+
+		_pixelMapData[ 12 ] = c4[ 0 ];
+		_pixelMapData[ 13 ] = c4[ 1 ];
+		_pixelMapData[ 14 ] = c4[ 2 ];
+
+		_pixelMapContext.putImageData( _pixelMapImage, 0, 0 );
+		_gradientMapContext.drawImage( _pixelMap, 0, 0 );
+
+		return _gradientMap;
+
+	}
+
 	function normalToComponent( normal ) {
 
 		// https://gist.github.com/665829

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff