Browse Source

Projector: Support for BufferGeometry without normals. Better handling of material.side.

Mr.doob 11 years ago
parent
commit
76cebbf645
2 changed files with 36 additions and 8 deletions
  1. 28 8
      src/core/Projector.js
  2. 8 0
      src/renderers/CanvasRenderer.js

+ 28 - 8
src/core/Projector.js

@@ -144,11 +144,15 @@ THREE.Projector = function () {
 		var normals = [];
 		var normals = [];
 
 
 		var object = null;
 		var object = null;
+		var material = null;
+
 		var normalMatrix = new THREE.Matrix3();
 		var normalMatrix = new THREE.Matrix3();
 
 
 		var setObject = function ( value ) {
 		var setObject = function ( value ) {
 
 
 			object = value;
 			object = value;
+			material = object.material;
+
 			normalMatrix.getNormalMatrix( object.matrixWorld );
 			normalMatrix.getNormalMatrix( object.matrixWorld );
 
 
 			normals.length = 0;
 			normals.length = 0;
@@ -191,14 +195,19 @@ THREE.Projector = function () {
 
 
 		};
 		};
 
 
+		var checkVerticesVisibility = function ( v1, v2, v3 ) {
+
+			return v1.visible === true && v2.visible === true && v3.visible === true;
+
+		};
+
 		var checkTriangleVisibility = function ( v1, v2, v3 ) {
 		var checkTriangleVisibility = function ( v1, v2, v3 ) {
 
 
 			_points3[ 0 ] = v1.positionScreen;
 			_points3[ 0 ] = v1.positionScreen;
 			_points3[ 1 ] = v2.positionScreen;
 			_points3[ 1 ] = v2.positionScreen;
 			_points3[ 2 ] = v3.positionScreen;
 			_points3[ 2 ] = v3.positionScreen;
 
 
-			if ( v1.visible === true || v2.visible === true || v3.visible === true ||
-				_clipBox.isIntersectionBox( _boundingBox.setFromPoints( _points3 ) ) ) {
+			if ( _clipBox.isIntersectionBox( _boundingBox.setFromPoints( _points3 ) ) ) {
 
 
 				return ( ( v3.positionScreen.x - v1.positionScreen.x ) *
 				return ( ( v3.positionScreen.x - v1.positionScreen.x ) *
 					    ( v2.positionScreen.y - v1.positionScreen.y ) -
 					    ( v2.positionScreen.y - v1.positionScreen.y ) -
@@ -235,7 +244,9 @@ THREE.Projector = function () {
 			var v2 = _vertexPool[ b ];
 			var v2 = _vertexPool[ b ];
 			var v3 = _vertexPool[ c ];
 			var v3 = _vertexPool[ c ];
 
 
-			if ( checkTriangleVisibility( v1, v2, v3 ) === true ) {
+			if ( checkVerticesVisibility( v1, v2, v3 ) === false ) return;
+
+			if ( material.side === THREE.DoubleSide || checkTriangleVisibility( v1, v2, v3 ) === true ) {
 
 
 				_face = getNextFaceInPool();
 				_face = getNextFaceInPool();
 
 
@@ -268,6 +279,7 @@ THREE.Projector = function () {
 		return {
 		return {
 			setObject: setObject,
 			setObject: setObject,
 			projectVertex: projectVertex,
 			projectVertex: projectVertex,
+			checkVerticesVisibility: checkVerticesVisibility,
 			checkTriangleVisibility: checkTriangleVisibility,
 			checkTriangleVisibility: checkTriangleVisibility,
 			pushVertex: pushVertex,
 			pushVertex: pushVertex,
 			pushNormal: pushNormal,
 			pushNormal: pushNormal,
@@ -328,11 +340,15 @@ THREE.Projector = function () {
 
 
 					}
 					}
 
 
-					var normals = attributes.normal.array;
+					if ( attributes.normal !== undefined ) {
+
+						var normals = attributes.normal.array;
+
+						for ( var i = 0, l = normals.length; i < l; i += 3 ) {
 
 
-					for ( var i = 0, l = normals.length; i < l; i += 3 ) {
+							renderList.pushNormal( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] );
 
 
-						renderList.pushNormal( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] );
+						}
 
 
 					}
 					}
 
 
@@ -454,10 +470,14 @@ THREE.Projector = function () {
 
 
 						}
 						}
 
 
+						if ( renderList.checkVerticesVisibility( v1, v2, v3 ) === false ) continue;
+
 						var visible = renderList.checkTriangleVisibility( v1, v2, v3 );
 						var visible = renderList.checkTriangleVisibility( v1, v2, v3 );
 
 
-						if ( ( visible === false && side === THREE.FrontSide ) ||
-							 ( visible === true && side === THREE.BackSide ) ) continue;
+						if ( side !== THREE.DoubleSide ) {
+							if ( side === THREE.FrontSide && visible === false ) continue;
+							if ( side === THREE.BackSide && visible === true ) continue;
+						}
 
 
 						_face = getNextFaceInPool();
 						_face = getNextFaceInPool();
 
 

+ 8 - 0
src/renderers/CanvasRenderer.js

@@ -734,6 +734,14 @@ THREE.CanvasRenderer = function ( parameters ) {
 				? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )
 				? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )
 				: fillPath( _color );
 				: fillPath( _color );
 
 
+		} else {
+
+			_color.setRGB( 1, 1, 1 );
+
+			material.wireframe === true
+				? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )
+				: fillPath( _color );
+
 		}
 		}
 
 
 	}
 	}