Browse Source

CanvasRenderer: add support for BufferGeometry with materials array

WestLangley 7 years ago
parent
commit
8cbe3dc075

+ 1 - 1
examples/canvas_geometry_panorama.html

@@ -81,7 +81,7 @@
 
 
 				];
 				];
 
 
-				var geometry = new THREE.BoxGeometry( 300, 300, 300, 7, 7, 7 );
+				var geometry = new THREE.BoxBufferGeometry( 300, 300, 300, 7, 7, 7 );
 				geometry.scale( - 1, 1, 1 );
 				geometry.scale( - 1, 1, 1 );
 
 
 				mesh = new THREE.Mesh( geometry, materials );
 				mesh = new THREE.Mesh( geometry, materials );

+ 7 - 5
examples/canvas_geometry_panorama_fisheye.html

@@ -81,18 +81,20 @@
 
 
 				];
 				];
 
 
-				var geometry = new THREE.BoxGeometry( 300, 300, 300, 7, 7, 7 );
+				var geometry = new THREE.BoxBufferGeometry( 300, 300, 300, 7, 7, 7 );
 				geometry.scale( - 1, 1, 1 );
 				geometry.scale( - 1, 1, 1 );
 
 
 				mesh = new THREE.Mesh( geometry, materials );
 				mesh = new THREE.Mesh( geometry, materials );
 				scene.add( mesh );
 				scene.add( mesh );
 
 
-				for ( var i = 0, l = mesh.geometry.vertices.length; i < l; i ++ ) {
+				var vec = new THREE.Vector3();
+				var positions = mesh.geometry.attributes.position;
 
 
-					var vertex = mesh.geometry.vertices[ i ];
+				for ( var i = 0, l = positions.count; i < l; i ++ ) {
 
 
-					vertex.normalize();
-					vertex.multiplyScalar( 550 );
+					vec.fromBufferAttribute( positions, i );
+					vec.setLength( 550 );
+					positions.setXYZ( i, vec.x, vec.y, vec.z );
 
 
 				}
 				}
 
 

+ 1 - 1
examples/canvas_geometry_text.html

@@ -80,7 +80,7 @@
 
 
 				}
 				}
 
 
-				var geometry = new THREE.TextGeometry( theText, {
+				var geometry = new THREE.TextBufferGeometry( theText, {
 
 
 					font: font,
 					font: font,
 					size: 80,
 					size: 80,

+ 45 - 9
examples/js/renderers/Projector.js

@@ -281,7 +281,7 @@ THREE.Projector = function () {
 
 
 		}
 		}
 
 
-		function pushTriangle( a, b, c ) {
+		function pushTriangle( a, b, c, material ) {
 
 
 			var v1 = _vertexPool[ a ];
 			var v1 = _vertexPool[ a ];
 			var v2 = _vertexPool[ b ];
 			var v2 = _vertexPool[ b ];
@@ -300,9 +300,11 @@ THREE.Projector = function () {
 				_face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3;
 				_face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3;
 				_face.renderOrder = object.renderOrder;
 				_face.renderOrder = object.renderOrder;
 
 
-				// use first vertex normal as face normal
-
-				_face.normalModel.fromArray( normals, a * 3 );
+				// face normal
+				_vector3.subVectors( v3.position, v2.position );
+				_vector4.subVectors( v1.position, v2.position );
+				_vector3.cross( _vector4 );
+				_face.normalModel.copy( _vector3 );
 				_face.normalModel.applyMatrix3( normalMatrix ).normalize();
 				_face.normalModel.applyMatrix3( normalMatrix ).normalize();
 
 
 				for ( var i = 0; i < 3; i ++ ) {
 				for ( var i = 0; i < 3; i ++ ) {
@@ -318,7 +320,7 @@ THREE.Projector = function () {
 
 
 				_face.vertexNormalsLength = 3;
 				_face.vertexNormalsLength = 3;
 
 
-				_face.material = object.material;
+				_face.material = material;
 
 
 				_renderData.elements.push( _face );
 				_renderData.elements.push( _face );
 
 
@@ -442,6 +444,10 @@ THREE.Projector = function () {
 
 
 				if ( geometry instanceof THREE.BufferGeometry ) {
 				if ( geometry instanceof THREE.BufferGeometry ) {
 
 
+					var material = object.material;
+
+					var isMultiMaterial = Array.isArray( material );
+
 					var attributes = geometry.attributes;
 					var attributes = geometry.attributes;
 					var groups = geometry.groups;
 					var groups = geometry.groups;
 
 
@@ -489,9 +495,15 @@ THREE.Projector = function () {
 
 
 								var group = groups[ g ];
 								var group = groups[ g ];
 
 
+								material = isMultiMaterial === true
+									 ? object.material[ group.materialIndex ]
+									 : object.material;
+
+								if ( material === undefined ) continue;
+
 								for ( var i = group.start, l = group.start + group.count; i < l; i += 3 ) {
 								for ( var i = group.start, l = group.start + group.count; i < l; i += 3 ) {
 
 
-									renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
+									renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], material );
 
 
 								}
 								}
 
 
@@ -501,7 +513,7 @@ THREE.Projector = function () {
 
 
 							for ( var i = 0, l = indices.length; i < l; i += 3 ) {
 							for ( var i = 0, l = indices.length; i < l; i += 3 ) {
 
 
-								renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
+								renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], material );
 
 
 							}
 							}
 
 
@@ -509,9 +521,33 @@ THREE.Projector = function () {
 
 
 					} else {
 					} else {
 
 
-						for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) {
+						if ( groups.length > 0 ) {
+
+							for ( var g = 0; g < groups.length; g ++ ) {
+
+								var group = groups[ g ];
+
+								material = isMultiMaterial === true
+									 ? object.material[ group.materialIndex ]
+									 : object.material;
 
 
-							renderList.pushTriangle( i, i + 1, i + 2 );
+								if ( material === undefined ) continue;
+
+								for ( var i = group.start, l = group.start + group.count; i < l; i += 3 ) {
+
+									renderList.pushTriangle( i, i + 1, i + 2, material );
+
+								}
+
+							}
+
+						} else {
+
+							for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) {
+
+								renderList.pushTriangle( i, i + 1, i + 2, material );
+
+							}
 
 
 						}
 						}