computeIntersections method

void computeIntersections(
  1. Raycaster raycaster,
  2. List<Intersection> intersects,
  3. dynamic rayLocalSpace
)
inherited

Implementation

void computeIntersections(Raycaster raycaster, List<Intersection> intersects, rayLocalSpace ) {
	Intersection? intersection;

	final geometry = this.geometry;
	final material = this.material;

	final index = geometry!.index;
	final position = geometry.attributes['position'];
	final uv = geometry.attributes['uv'];
	final uv1 = geometry.attributes['uv1'];
	final normal = geometry.attributes['normal'];
	final groups = geometry.groups;
	final drawRange = geometry.drawRange;

	if ( index != null ) {
		if (material is GroupMaterial) {
			for (int i = 0, il = groups.length; i < il; i ++ ) {
				final group = groups[ i ];
				final groupMaterial = material.children[ group['materialIndex'] ];

				final start = math.max<int>( group['start'], drawRange['start']! );
				final end = math.min<int>( index.count, math.min( ( group['start'] + group['count'] ), ( drawRange['start']! + drawRange['count']! ) ) );

				for (int j = start, jl = end; j < jl; j += 3 ) {
					final a = index.getX( j )!.toInt();
					final b = index.getX( j + 1 )!.toInt();
					final c = index.getX( j + 2 )!.toInt();

					intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );

					if ( intersection != null) {
						intersection.faceIndex = ( j / 3 ).floor(); // triangle number in indexed buffer semantics
						intersection.face?.materialIndex = group['materialIndex'];
						intersects.add( intersection );
					}
				}
			}
		}
      else {
			final start = math.max<int>( 0, drawRange['start']! );
			final end = math.min( index.count, ( drawRange['start']! + drawRange['count']! ) );

			for (int i = start, il = end; i < il; i += 3 ) {
				final a = index.getX( i )!.toInt();
				final b = index.getX( i + 1 )!.toInt();
				final c = index.getX( i + 2 )!.toInt();

				intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );

				if ( intersection != null) {
					intersection.faceIndex = ( i / 3 ).floor(); // triangle number in indexed buffer semantics
					intersects.add( intersection );
				}
			}
		}
	}
    else if ( position != null ) {
		if (material is GroupMaterial) {
			for (int i = 0, il = groups.length; i < il; i ++ ) {
				final group = groups[ i ];
				final groupMaterial = material.children[ group['materialIndex'] ];

				final start = math.max<int>( group['start'], drawRange['start']! );
				final end = math.min<int>( position.count, math.min<int>( ( group['start'] + group['count'] ), ( drawRange['start']! + drawRange['count']! ) ) );

				for (int j = start, jl = end; j < jl; j += 3 ) {
					final a = j;
					final b = j + 1;
					final c = j + 2;

					intersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );

					if ( intersection != null) {
						intersection.faceIndex = ( j / 3 ).floor(); // triangle number in non-indexed buffer semantics
						intersection.face?.materialIndex = group['materialIndex'];
						intersects.add( intersection );
					}
				}
			}
		}
      else {
			final start = math.max<int>( 0, drawRange['start']! );
			final end = math.min<int>( position.count, ( drawRange['start']! + drawRange['count']! ) );

			for (int i = start, il = end; i < il; i += 3 ) {
				final a = i;
				final b = i + 1;
				final c = i + 2;

				intersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );

				if ( intersection != null) {
					intersection.faceIndex = ( i / 3 ).floor(); // triangle number in non-indexed buffer semantics
					intersects.add( intersection );
				}
			}
		}
	}
}