|
@@ -190,13 +190,13 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {
|
|
|
+ function checkBufferGeometryIntersection( object, material, raycaster, ray, position, uv, a, b, c ) {
|
|
|
|
|
|
vA.fromBufferAttribute( position, a );
|
|
|
vB.fromBufferAttribute( position, b );
|
|
|
vC.fromBufferAttribute( position, c );
|
|
|
|
|
|
- var intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );
|
|
|
+ var intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint );
|
|
|
|
|
|
if ( intersection ) {
|
|
|
|
|
@@ -259,24 +259,64 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
var index = geometry.index;
|
|
|
var position = geometry.attributes.position;
|
|
|
var uv = geometry.attributes.uv;
|
|
|
- var i, l;
|
|
|
+ var groups = geometry.groups;
|
|
|
+ var drawRange = geometry.drawRange;
|
|
|
+ var i, j, il, jl;
|
|
|
+ var group, groupMaterial;
|
|
|
+ var start, end;
|
|
|
|
|
|
if ( index !== null ) {
|
|
|
|
|
|
// indexed buffer geometry
|
|
|
|
|
|
- for ( i = 0, l = index.count; i < l; i += 3 ) {
|
|
|
+ if ( Array.isArray( material ) ) {
|
|
|
|
|
|
- a = index.getX( i );
|
|
|
- b = index.getX( i + 1 );
|
|
|
- c = index.getX( i + 2 );
|
|
|
+ for ( i = 0, il = groups.length; i < il; i ++ ) {
|
|
|
|
|
|
- intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
|
|
|
+ group = groups[ i ];
|
|
|
+ groupMaterial = material[ group.materialIndex ];
|
|
|
|
|
|
- if ( intersection ) {
|
|
|
+ start = Math.max( group.start, drawRange.start );
|
|
|
+ end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
|
|
|
|
|
|
- intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
|
|
|
- intersects.push( intersection );
|
|
|
+ for ( j = start, jl = end; j < jl; j += 3 ) {
|
|
|
+
|
|
|
+ a = index.getX( i );
|
|
|
+ b = index.getX( i + 1 );
|
|
|
+ c = index.getX( i + 2 );
|
|
|
+
|
|
|
+ intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c );
|
|
|
+
|
|
|
+ if ( intersection ) {
|
|
|
+
|
|
|
+ intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
|
|
|
+ intersects.push( intersection );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ start = Math.max( 0, drawRange.start );
|
|
|
+ end = Math.min( index.count, ( drawRange.start + drawRange.count ) );
|
|
|
+
|
|
|
+ for ( i = start, il = end; i < il; i += 3 ) {
|
|
|
+
|
|
|
+ a = index.getX( i );
|
|
|
+ b = index.getX( i + 1 );
|
|
|
+ c = index.getX( i + 2 );
|
|
|
+
|
|
|
+ intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c );
|
|
|
+
|
|
|
+ if ( intersection ) {
|
|
|
+
|
|
|
+ intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics
|
|
|
+ intersects.push( intersection );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -286,18 +326,54 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
|
|
// non-indexed buffer geometry
|
|
|
|
|
|
- for ( i = 0, l = position.count; i < l; i += 3 ) {
|
|
|
+ if ( Array.isArray( material ) ) {
|
|
|
+
|
|
|
+ for ( i = 0, il = groups.length; i < il; i ++ ) {
|
|
|
+
|
|
|
+ group = groups[ i ];
|
|
|
+ groupMaterial = material[ group.materialIndex ];
|
|
|
+
|
|
|
+ start = Math.max( group.start, drawRange.start );
|
|
|
+ end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );
|
|
|
+
|
|
|
+ for ( j = start, jl = end; j < jl; j += 3 ) {
|
|
|
+
|
|
|
+ a = j;
|
|
|
+ b = j + 1;
|
|
|
+ c = j + 2;
|
|
|
+
|
|
|
+ intersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, uv, a, b, c );
|
|
|
+
|
|
|
+ if ( intersection ) {
|
|
|
+
|
|
|
+ intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
|
|
|
+ intersects.push( intersection );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ start = Math.max( 0, drawRange.start );
|
|
|
+ end = Math.min( position.count, ( drawRange.start + drawRange.count ) );
|
|
|
+
|
|
|
+ for ( i = start, il = end; i < il; i += 3 ) {
|
|
|
+
|
|
|
+ a = i;
|
|
|
+ b = i + 1;
|
|
|
+ c = i + 2;
|
|
|
|
|
|
- a = i;
|
|
|
- b = i + 1;
|
|
|
- c = i + 2;
|
|
|
+ intersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, uv, a, b, c );
|
|
|
|
|
|
- intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
|
|
|
+ if ( intersection ) {
|
|
|
|
|
|
- if ( intersection ) {
|
|
|
+ intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
|
|
|
+ intersects.push( intersection );
|
|
|
|
|
|
- intersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics
|
|
|
- intersects.push( intersection );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|