Procházet zdrojové kódy

Projector: Handle BufferGeometry offsets.

Mr.doob před 11 roky
rodič
revize
8612c4b571
1 změnil soubory, kde provedl 33 přidání a 15 odebrání
  1. 33 15
      src/core/Projector.js

+ 33 - 15
src/core/Projector.js

@@ -316,45 +316,63 @@ THREE.Projector = function () {
 				if ( geometry instanceof THREE.BufferGeometry ) {
 
 					var attributes = geometry.attributes;
+					var offsets = geometry.offsets;
 
-					if ( attributes.position !== undefined ) {
+					if ( attributes.position === undefined ) continue;
 
-						var positions = attributes.position.array;
+					var positions = attributes.position.array;
 
-						for ( var i = 0, l = positions.length; i < l; i += 3 ) {
+					for ( var i = 0, l = positions.length; i < l; i += 3 ) {
 
-							renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] );
+						renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] );
 
-						}
+					}
 
-						var normals = attributes.normal.array;
+					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 ] );
 
-						}
+					}
 
-						if ( attributes.index !== undefined ) {
+					if ( attributes.index !== undefined ) {
 
-							var indices = attributes.index.array;
+						var indices = attributes.index.array;
 
-							for ( var i = 0, l = indices.length; i < l; i += 3 ) {
+						if ( offsets.length > 0 ) {
 
-								renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
+							for ( var o = 0; o < offsets.length; o ++ ) {
+
+								var offset = offsets[ o ];
+								var index = offset.index;
+
+								for ( var i = offset.start, l = offset.start + offset.count; i < l; i += 3 ) {
+
+									renderList.pushTriangle( indices[ i ] + index, indices[ i + 1 ] + index, indices[ i + 2 ] + index );
+
+								}
 
 							}
 
 						} else {
 
-							for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) {
+							for ( var i = 0, l = indices.length; i < l; i += 3 ) {
 
-								renderList.pushTriangle( i, i + 1, i + 2 );
+								renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
 
 							}
 
 						}
 
+					} else {
+
+						for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) {
+
+							renderList.pushTriangle( i, i + 1, i + 2 );
+
+						}
+
 					}
 
 				} else if ( geometry instanceof THREE.Geometry2 ) {