import { Box3, type Intersection, Object3D, Raycaster, Vector3, RaycasterParameters, Face } from 'three';
import { ExtendedTriangle, ShapecastIntersection } from 'three-mesh-bvh';
import { BatchObject } from '../batching/BatchObject.js';
import SpeckleMesh from './SpeckleMesh.js';
import SpeckleInstancedMesh from './SpeckleInstancedMesh.js';
export declare const NOT_INTERSECTED: ShapecastIntersection;
export declare const INTERSECTED: ShapecastIntersection;
export declare const CONTAINED: ShapecastIntersection;
export type ExtendedShapeCastCallbacks = {
    intersectsTAS?: (box: Box3, isLeaf: boolean, score: number | undefined, depth: number, nodeIndex: number) => ShapecastIntersection | boolean;
    intersectTASRange?: (batchObjects: BatchObject) => ShapecastIntersection | boolean;
    intersectsBounds: (box: Box3, isLeaf: boolean, score: number | undefined, depth: number, nodeIndex: number) => ShapecastIntersection | boolean;
    traverseBoundsOrder?: (box: Box3) => number;
} & ({
    intersectsRange: (triangleOffset: number, triangleCount: number, contained: boolean, depth: number, nodeIndex: number, box: Box3) => boolean;
} | {
    intersectsTriangle: (triangle: ExtendedTriangle, triangleIndex: number, contained: boolean, depth: number, batchObject?: BatchObject) => boolean | void;
});
export interface ExtendedIntersection extends Intersection {
    batchObject?: BatchObject;
    pointOnLine?: Vector3;
}
export interface MeshIntersection extends Intersection {
    face: Face;
    faceIndex: number;
}
export interface ExtendedMeshIntersection extends MeshIntersection {
    batchObject: BatchObject;
    object: SpeckleMesh | SpeckleInstancedMesh;
}
export interface ExtendedRaycasterParameters extends RaycasterParameters {
    Line2: {
        threshold: number;
    };
}
export declare class SpeckleRaycaster extends Raycaster {
    intersectTASOnly: boolean;
    onObjectIntersectionTest: ((object: Object3D) => void) | null;
    params: ExtendedRaycasterParameters;
    constructor(origin?: Vector3, direction?: Vector3, near?: number, far?: number);
    intersectObjects(objects: Array<Object3D>, recursive?: boolean, intersects?: never[]): never[];
}
