Kaynağa Gözat

Removed groups/offsets/drawcalls code from raycast methods.

Mr.doob 10 yıl önce
ebeveyn
işleme
7488add52f
3 değiştirilmiş dosya ile 61 ekleme ve 119 silme
  1. 22 42
      src/objects/Line.js
  2. 33 52
      src/objects/Mesh.js
  3. 6 25
      src/objects/PointCloud.js

+ 22 - 42
src/objects/Line.js

@@ -67,57 +67,37 @@ THREE.Line.prototype.raycast = ( function () {
 
 
 				var indices = index.array;
 				var indices = index.array;
 				var positions = attributes.position.array;
 				var positions = attributes.position.array;
-				var offsets = geometry.groups;
 
 
-				if ( offsets.length === 0 ) {
+				for ( var i = 0, l = indices.length - 1; i < l; i += step ) {
 
 
-					offsets = [ {
-						start: 0,
-						count: indices.length
-					} ];
+					var a = indices[ i ];
+					var b = indices[ i + 1 ];
 
 
-				}
-
-				for ( var oi = 0; oi < offsets.length; oi ++ ) {
-
-					var offset = offsets[ oi ];
-
-					var start = offset.start;
-					var count = offset.count;
-
-					for ( var i = start; i < start + count - 1; i += step ) {
-
-						var a = indices[ i ];
-						var b = indices[ i + 1 ];
+					vStart.fromArray( positions, a * 3 );
+					vEnd.fromArray( positions, b * 3 );
 
 
-						vStart.fromArray( positions, a * 3 );
-						vEnd.fromArray( positions, b * 3 );
-
-						var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
-
-						if ( distSq > precisionSq ) continue;
+					var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
 
 
-						interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
+					if ( distSq > precisionSq ) continue;
 
 
-						var distance = raycaster.ray.origin.distanceTo( interRay );
+					interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
 
 
-						if ( distance < raycaster.near || distance > raycaster.far ) continue;
+					var distance = raycaster.ray.origin.distanceTo( interRay );
 
 
-						intersects.push( {
+					if ( distance < raycaster.near || distance > raycaster.far ) continue;
 
 
-							distance: distance,
-							// What do we want? intersection point on the ray or on the segment??
-							// point: raycaster.ray.at( distance ),
-							point: interSegment.clone().applyMatrix4( this.matrixWorld ),
-							index: i,
-							offsetIndex: oi,
-							face: null,
-							faceIndex: null,
-							object: this
+					intersects.push( {
 
 
-						} );
+						distance: distance,
+						// What do we want? intersection point on the ray or on the segment??
+						// point: raycaster.ray.at( distance ),
+						point: interSegment.clone().applyMatrix4( this.matrixWorld ),
+						index: i,
+						face: null,
+						faceIndex: null,
+						object: this
 
 
-					}
+					} );
 
 
 				}
 				}
 
 
@@ -125,7 +105,7 @@ THREE.Line.prototype.raycast = ( function () {
 
 
 				var positions = attributes.position.array;
 				var positions = attributes.position.array;
 
 
-				for ( var i = 0; i < positions.length / 3 - 1; i += step ) {
+				for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {
 
 
 					vStart.fromArray( positions, 3 * i );
 					vStart.fromArray( positions, 3 * i );
 					vEnd.fromArray( positions, 3 * i + 3 );
 					vEnd.fromArray( positions, 3 * i + 3 );
@@ -167,7 +147,7 @@ THREE.Line.prototype.raycast = ( function () {
 				var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
 				var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
 
 
 				if ( distSq > precisionSq ) continue;
 				if ( distSq > precisionSq ) continue;
-				
+
 				interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
 				interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
 
 
 				var distance = raycaster.ray.origin.distanceTo( interRay );
 				var distance = raycaster.ray.origin.distanceTo( interRay );

+ 33 - 52
src/objects/Mesh.js

@@ -138,75 +138,56 @@ THREE.Mesh.prototype.raycast = ( function () {
 
 
 				var indices = index.array;
 				var indices = index.array;
 				var positions = attributes.position.array;
 				var positions = attributes.position.array;
-				var offsets = geometry.groups;
 
 
-				if ( offsets.length === 0 ) {
+				for ( var i = 0, l = indices.length; i < l; i += 3 ) {
 
 
-					offsets = [ {
-						start: 0,
-						count: indices.length
-					} ];
+					a = indices[ i ];
+					b = indices[ i + 1 ];
+					c = indices[ i + 2 ];
 
 
-				}
-
-				for ( var oi = 0, ol = offsets.length; oi < ol; ++ oi ) {
-
-					var offset = offsets[ oi ];
-
-					var start = offset.start;
-					var count = offset.count;
-
-					for ( var i = start, il = start + count; i < il; i += 3 ) {
-
-						a = indices[ i ];
-						b = indices[ i + 1 ];
-						c = indices[ i + 2 ];
-
-						vA.fromArray( positions, a * 3 );
-						vB.fromArray( positions, b * 3 );
-						vC.fromArray( positions, c * 3 );
-
-						if ( material.side === THREE.BackSide ) {
+					vA.fromArray( positions, a * 3 );
+					vB.fromArray( positions, b * 3 );
+					vC.fromArray( positions, c * 3 );
 
 
-							if ( ray.intersectTriangle( vC, vB, vA, true, intersectionPoint ) === null ) continue;
+					if ( material.side === THREE.BackSide ) {
 
 
-						} else {
+						if ( ray.intersectTriangle( vC, vB, vA, true, intersectionPoint ) === null ) continue;
 
 
-							if ( ray.intersectTriangle( vA, vB, vC, material.side !== THREE.DoubleSide, intersectionPoint ) === null ) continue;
+					} else {
 
 
-						}
+						if ( ray.intersectTriangle( vA, vB, vC, material.side !== THREE.DoubleSide, intersectionPoint ) === null ) continue;
 
 
-						intersectionPointWorld.copy( intersectionPoint );
-						intersectionPointWorld.applyMatrix4( this.matrixWorld );
+					}
 
 
-						var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );
+					intersectionPointWorld.copy( intersectionPoint );
+					intersectionPointWorld.applyMatrix4( this.matrixWorld );
 
 
-						if ( distance < raycaster.near || distance > raycaster.far ) continue;
+					var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );
 
 
-						var uv;
+					if ( distance < raycaster.near || distance > raycaster.far ) continue;
 
 
-						if ( attributes.uv !== undefined ) {
+					var uv;
 
 
-							var uvs = attributes.uv.array;
-							uvA.fromArray( uvs, a * 2 );
-							uvB.fromArray( uvs, b * 2 );
-							uvC.fromArray( uvs, c * 2 );
-							uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );
+					if ( attributes.uv !== undefined ) {
 
 
-						}
+						var uvs = attributes.uv.array;
+						uvA.fromArray( uvs, a * 2 );
+						uvB.fromArray( uvs, b * 2 );
+						uvC.fromArray( uvs, c * 2 );
+						uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );
 
 
-						intersects.push( {
+					}
 
 
-							distance: distance,
-							point: intersectionPointWorld.clone(),
-							uv: uv,
-							face: new THREE.Face3( a, b, c, THREE.Triangle.normal( vA, vB, vC ) ),
-							faceIndex: Math.floor( i / 3 ), // triangle number in indices buffer semantics
-							object: this
+					intersects.push( {
 
 
-						} );
+						distance: distance,
+						point: intersectionPointWorld.clone(),
+						uv: uv,
+						face: new THREE.Face3( a, b, c, THREE.Triangle.normal( vA, vB, vC ) ),
+						faceIndex: Math.floor( i / 3 ), // triangle number in indices buffer semantics
+						object: this
 
 
-					}
+					} );
 
 
 				}
 				}
 
 
@@ -214,7 +195,7 @@ THREE.Mesh.prototype.raycast = ( function () {
 
 
 				var positions = attributes.position.array;
 				var positions = attributes.position.array;
 
 
-				for ( var i = 0, il = positions.length; i < il; i += 9 ) {
+				for ( var i = 0, l = positions.length; i < l; i += 9 ) {
 
 
 					vA.fromArray( positions, i );
 					vA.fromArray( positions, i );
 					vB.fromArray( positions, i + 3 );
 					vB.fromArray( positions, i + 3 );

+ 6 - 25
src/objects/PointCloud.js

@@ -44,7 +44,7 @@ THREE.PointCloud.prototype.raycast = ( function () {
 		var localThresholdSq = localThreshold * localThreshold;
 		var localThresholdSq = localThreshold * localThreshold;
 		var position = new THREE.Vector3();
 		var position = new THREE.Vector3();
 
 
-		var testPoint = function ( point, index ) {
+		function testPoint( point, index ) {
 
 
 			var rayPointDistanceSq = ray.distanceSqToPoint( point );
 			var rayPointDistanceSq = ray.distanceSqToPoint( point );
 
 
@@ -70,7 +70,7 @@ THREE.PointCloud.prototype.raycast = ( function () {
 
 
 			}
 			}
 
 
-		};
+		}
 
 
 		if ( geometry instanceof THREE.BufferGeometry ) {
 		if ( geometry instanceof THREE.BufferGeometry ) {
 
 
@@ -81,33 +81,14 @@ THREE.PointCloud.prototype.raycast = ( function () {
 			if ( index !== null ) {
 			if ( index !== null ) {
 
 
 				var indices = index.array;
 				var indices = index.array;
-				var offsets = geometry.groups;
-
-				if ( offsets.length === 0 ) {
-
-					offsets = [ {
-						start: 0,
-						count: indices.length
-					} ];
-
-				}
-
-				for ( var oi = 0, ol = offsets.length; oi < ol; ++ oi ) {
-
-					var offset = offsets[ oi ];
-
-					var start = offset.start;
-					var count = offset.count;
-
-					for ( var i = start, il = start + count; i < il; i ++ ) {
 
 
-						var a = indices[ i ];
+				for ( var i = 0, il = indices.length; i < il; i ++ ) {
 
 
-						position.fromArray( positions, a * 3 );
+					var a = indices[ i ];
 
 
-						testPoint( position, a );
+					position.fromArray( positions, a * 3 );
 
 
-					}
+					testPoint( position, a );
 
 
 				}
 				}