import { Box3, Box3Helper, Material, Ray, Side } from 'three';
import { BatchObject } from '../batching/BatchObject';
import { ExtendedIntersection, ExtendedShapeCastCallbacks } from './SpeckleRaycaster';
import { AccelerationStructure } from './AccelerationStructure';
/**
 *
  _____                            _              _
 |_   _|                          | |            | |
   | |  _ __ ___  _ __   ___  _ __| |_ __ _ _ __ | |_
   | | | '_ ` _ \| '_ \ / _ \| '__| __/ _` | '_ \| __|
  _| |_| | | | | | |_) | (_) | |  | || (_| | | | | |_
 |_____|_| |_| |_| .__/ \___/|_|   \__\__,_|_| |_|\__|
                 | |
                 |_|

  Unlike the BVHs for the individual objects, which act as our BAS, the TAS *is not relative to the world origin*!
  All coordinates are the final world coordinates derived from the BAS bounding boxes, after all transformations.
  In theory this might mean the TAS is not 100% accurate for objects far away from origin, but I think it should do
  fine as it is. If we really really really need that 100% accuracy, we'll just make it relative to the origin
 */
export declare class TopLevelAccelerationStructure {
    private static debugBoxes;
    private static cubeIndices;
    private static CUBE_VERTS;
    batchObjects: BatchObject[];
    bounds: Box3;
    boxHelpers: Box3Helper[];
    accelerationStructure: AccelerationStructure;
    lastRefitTime: number;
    constructor(batchObjects: BatchObject[]);
    private buildBVH;
    private updateVertArray;
    refit(): void;
    raycast(ray: Ray, materialOrSide?: Side | Material | Material[]): ExtendedIntersection[];
    raycastFirst(ray: Ray, materialOrSide?: Side | Material | Material[]): ExtendedIntersection;
    shapecast(callbacks: ExtendedShapeCastCallbacks): boolean;
    getBoundingBox(target: Box3): Box3;
}
