import { SparseVoxelGrid } from './sparse-voxel-grid';
/**
 * Compute the grid of voxels that are visited but not blocked
 * (i.e. reachable empty voxels).
 *
 * @param visited - Grid of visited voxels (from BFS).
 * @param blocked - Grid of blocked voxels (obstacles).
 * @returns Grid containing only voxels that are visited AND not blocked.
 */
declare function computeEmptyGrid(visited: SparseVoxelGrid, blocked: SparseVoxelGrid): SparseVoxelGrid;
/**
 * Compute the union of two sparse voxel grids (bitwise OR).
 *
 * @param a - First grid. By default a fresh clone is taken as the base;
 * with `consumeA=true` it is mutated in place and returned, saving one
 * full grid's worth of clone allocation.
 * @param b - Second grid (OR'd into the result).
 * @param consumeA - If true, `a` is mutated in place and returned. The
 * caller must not subsequently read `a` as an independent value
 * (the returned grid IS `a`).
 * @param onProgress - Optional progress callback over `b.types` words.
 * @returns Grid containing the union of both inputs. Equal to `a` when
 * `consumeA=true`, otherwise a freshly cloned grid.
 */
declare function sparseOrGrids(a: SparseVoxelGrid, b: SparseVoxelGrid, consumeA?: boolean, onProgress?: (done: number, total: number) => void): SparseVoxelGrid;
export { computeEmptyGrid, sparseOrGrids };
